10

のフレームを変更しようと 2 日間試みましたがUILabel、これはばかげています... UILabelIBOutlet ですが、それが機能しない理由ではありませんUILabel。プログラムで を作成しようとしましたが、まだ機能しませんでした。これが私がそれを行う方法です:

self.descriptionLabel.text = description;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0]
                                         constrainedToSize:CGSizeMake(self.descriptionLabel.frame.size.width, FLT_MAX)
                                             lineBreakMode:self.descriptionLabel.lineBreakMode];
CGFloat frameHeight = textSize.height;
CGRect frame = self.descriptionLabel.frame;
frame.size.height = frameHeight;
self.descriptionLabel.frame = frame;

CGRect bounds = self.descriptionLabel.frame;
bounds.origin.x = self.descriptionLabel.frame.origin.x + 10.0;
bounds.size.width = self.descriptionLabel.frame.size.width - 20.0;
self.descriptionLabel.bounds = bounds;
self.descriptionLabel.numberOfLines = 0;

すでに IRC に問い合わせたところ、フレームが変更されない理由はないと言われました...

また、フレームを作成しCGRectMakeて任意の値を指定しようとしましたが、それでもうまくいきませんでした..

何が問題なのか知っている人はいますか?

編集 1:前後のフレームをログに記録したところ、奇妙な結果が得られました。

Before: 0.000000 0.000000 0.000000 0.000000
After: 0.000000 0.000000 0.000000 33525.000000

フレームを設定した後の高さは、意味のある唯一の値です (ラベルには意図的に多くのテキストがあります)。

編集 2:次のようにコードを変更しました。ログには、フレームが変更されたことが示されていますが、シミュレーターでは変更されていません。のレイヤーに赤い枠線を追加して証明しましたUILabel

self.descriptionLabel.text = description;
self.descriptionLabel.lineBreakMode = NSLineBreakByWordWrapping;

CGSize textSize = [self.descriptionLabel.text sizeWithFont:[UIFont systemFontOfSize:12.0]
                                         constrainedToSize:CGSizeMake(self.view.frame.size.width, FLT_MAX)
                                             lineBreakMode:self.descriptionLabel.lineBreakMode];
CGFloat frameHeight = textSize.height;
CGRect frame = CGRectMake(0.0, 300.0, self.view.frame.size.width, frameHeight);
self.descriptionLabel.frame = frame;

DDLogInfo(@"After: %f %f %f %f", self.descriptionLabel.frame.origin.x, self.descriptionLabel.frame.origin.y, self.descriptionLabel.frame.size.width, self.descriptionLabel.frame.size.height);
// After: 0.000000 300.000000 320.000000 585.000000

self.descriptionLabel.numberOfLines = 0;
self.descriptionLabel.layer.borderColor = [UIColor redColor].CGColor;
self.descriptionLabel.layer.borderWidth = 2;

証拠

4

2 に答える 2

26

自動レイアウトを使用している場合は、フレームの設定を行うべきではありません。自動レイアウトをオフにするか、制約を使用してラベルのサイズを変更してください。これを行う最も簡単な方法は、IB でラベルに高さの制約 (一定の幅が必要な場合は幅も) を与え、それに IBOutlet を作成することです。次に、コードで、sizeWithFont:constrainedToSize:lineBreakMode: から取得した値に基づいて、その制約の定数値を変更します。

于 2013-07-06T17:15:06.530 に答える