回答:
私がUILabel
非常によく似たもののためにカテゴリを作成した私の要点を確認してください。私のカテゴリは、UILabel
すべてのコンテンツを表示するために高さを伸ばします:https : //gist.github.com/1005520
または、この投稿を確認してください:https : //stackoverflow.com/a/7242981/662605
これは高さを伸ばしますが、逆に簡単に変更して幅を伸ばすことができます。これはあなたがやりたいことだと私は信じています:
@implementation UILabel (dynamicSizeMeWidth)
- (void)resizeToStretch{
float width = [self expectedWidth];
CGRect newFrame = [self frame];
newFrame.size.width = width;
[self setFrame:newFrame];
}
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);
CGSize expectedLabelSize = [[self text] sizeWithFont:[self font]
constrainedToSize:maximumLabelSize
lineBreakMode:[self lineBreakMode]];
return expectedLabelSize.width;
}
@end
クラスsizeToFit
から使用できるメソッドをより簡単に使用できますが、UIView
安全のために行数を1に設定します。
AutoLayoutを使用している場合は、組み込みのソリューションがあります。行数を0に設定すると、フレームワークはテキストに合わせてラベルのサイズを適切に変更します(高さを追加します)。
sizeWithFont:
廃止予定なので、sizeWithAttributes:
代わりに使用してください:
- (float)expectedWidth{
[self setNumberOfLines:1];
CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];
return expectedLabelSize.width;
}
を使用して[label sizeToFit];
も、Danielsカテゴリから同じ結果が得られます。
ただし、自動レイアウトを使用して、制約に基づいてラベルのサイズを変更することをお勧めします。
UILabel
テキストサイズに基づいて縮小および拡大する必要がある場合は、自動レイアウト付きのストーリーボードが最適です。以下はこれを達成するための手順です
UILabelをビューコントローラーに配置し、好きな場所に配置します。のプロパティにも配置さ0
れnumberOfLines
ますUILabel
。
トップ、リーディング、トレーリングのスペースピン制約を指定します。
Update Frame
、をクリックしFix Misplacement
ます。このUILabelは、テキストが少ない場合は縮小し、テキストが多い場合は拡大します。これは、他のいくつかの回答が行うほど複雑ではありません。
自動レイアウトを使用して制約を追加し、ラベルの左側と上側を固定します。
その後、自動的にサイズ変更されます。
sizeToFit
自動レイアウトを使用する場合は設定する必要はありません。サンプルプロジェクトの完全なコードは次のとおりです。
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myLabel: UILabel!
@IBAction func changeTextButtonTapped(sender: UIButton) {
myLabel.text = "my name is really long i want it to fit in this box"
}
}
myLabel.preferredMaxLayoutWidth = 150 // or whatever
コードを追加します。(また、ボタンをラベルの下部に固定して、ラベルの高さが上がるとボタンが下に移動するようにしました。)UITableViewCell
場合は、この回答を参照してください。上記のダニエルの回答に基づいていくつかのメソッドを作成しました。
-(CGFloat)heightForLabel:(UILabel *)label withText:(NSString *)text
{
CGSize maximumLabelSize = CGSizeMake(290, FLT_MAX);
CGSize expectedLabelSize = [text sizeWithFont:label.font
constrainedToSize:maximumLabelSize
lineBreakMode:label.lineBreakMode];
return expectedLabelSize.height;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label
{
CGRect newFrame = label.frame;
newFrame.size.height = [self heightForLabel:label withText:label.text];
label.frame = newFrame;
}
-(void)resizeHeightToFitForLabel:(UILabel *)label withText:(NSString *)text
{
label.text = text;
[self resizeHeightToFitForLabel:label];
}
@implementation UILabel (UILabel_Auto)
- (void)adjustHeight {
if (self.text == nil) {
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.bounds.size.width, 0);
return;
}
CGSize aSize = self.bounds.size;
CGSize tmpSize = CGRectInfinite.size;
tmpSize.width = aSize.width;
tmpSize = [self.text sizeWithFont:self.font constrainedToSize:tmpSize];
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, aSize.width, tmpSize.height);
}
@end
これはカテゴリー方式です。UILabelの高さを調整するには、このメソッドを呼び出すよりも先にテキストを設定する必要があります。
2つの方法を使用して、テキストやその他の関連コントロールに従ってラベルのサイズを変更できます。
iOS 7.0以降の場合
CGSize labelTextSize = [labelText boundingRectWithSize:CGSizeMake(labelsWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName : labelFont
}
context:nil].size;
iOS 7.0より前は、これを使用してラベルサイズを計算できました
CGSize labelTextSize = [label.text sizeWithFont:label.font
constrainedToSize:CGSizeMake(label.frame.size.width, MAXFLOAT)
lineBreakMode:NSLineBreakByWordWrapping];
// labelTextHeightに基づいて他のコントロールをリフレームします
CGFloat labelTextHeight = labelTextSize.height;
ラベルのテキストのサイズを計算したくない場合は、UILabelのインスタンスで-sizeToFitを使用できます-
[label setNumberOfLines:0]; // for multiline label
[label setText:@"label text to set"];
[label sizeToFit];// call this to fit size of the label according to text
//この後、ラベルフレームを取得して、他の関連するコントロールをリフレームできます
[label sizeToFit];
viewDidLoadに追加自動レイアウトで大きな問題が発生しました。テーブルセル内に2つのコンテナーがあります。2番目のコンテナーは、アイテムの説明(0〜1000文字)に応じてサイズ変更され、行はそれらに基づいてサイズ変更する必要があります。
不足している成分は、説明の下部の制約でした。
動的要素の下部の制約を= 0から> = 0に変更しました。