境界プロパティは CGRect です。CGRect は Objective-C オブジェクトではないため、 を使用して直接印刷することはできません%@
。最初に次を使用して文字列に変換する必要がありますNSStringFromCGRect
。
NSLog(@"bounds: %@", NSStringFromCGRect(label.bounds));
とその周囲の要素のレイアウトを処理する最善の方法UILabel
は、カスタムUIView
サブクラスを作成してラベルやその他の要素を含め、そのlayoutSubviews
メソッドをオーバーライドしてレイアウトを行うことです。
たとえば、ラベルと画像ビューが必要で、画像ビューをラベルの下端に合わせたいとします。UIView
という名前のサブクラスを作成できますContainerView
。
@interface ContainerView : UIView
@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) UIImageView *imageView;
@end
これをラベルのスーパービューおよび画像ビューとして使用できます。ContainerView に依存してラベルと画像をレイアウトするため、それらのフレームを指定する必要はありません。また、ContainerView を使用して、ラベルと画像ビューをサブビューとして追加します。
ContainerView *superView = [[ContainerView alloc] initWithFrame:someRect];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero];
label.text = someString;
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
superView.label = label;
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImage"]];
superView.imageView = imageView;
[self.view addSubview:superView];
ContainerView を実装する方法は次のとおりです (ARC を使用していると仮定します)。
@implementation ContainerView
@synthesize label = _label;
@synthesize imageView = _imageView;
ContainerView の「ラベル」セッターをオーバーライドして、ラベルをサブビューとして追加します。
- (void)setLabel:(UILabel *)label {
if (_label) {
[_label removeFromSuperview];
}
_label = label;
if (_label) {
[self addSubview:label];
}
}
「imageView」セッターについても同じことを行います。
- (void)setImageView:(UIImageView *)imageView {
if (_imageView) {
[_imageView removeFromSuperview];
}
_imageView = imageView;
if (_imageView) {
[self addSubview:imageView];
}
}
興味深い部分はlayoutSubviews
メソッドです。システムはlayoutSubviews
、新しいサブビューを取得した後やサイズが変更されたときなど、さまざまな時点でメッセージをビューに送信します。
- (void)layoutSubviews {
[super layoutSubviews];
// Put the label's upper left corner at (20, 20) and make it as wide as I am,
// minus a 20 point margin on each side.
self.label.frame = CGRectMake(20, 20, self.bounds.size.width - 40, 10000);
// Tell the label to make itself exactly large enough to fit its text. This will
// shrink its height.
[self.label sizeToFit];
// Now put the image view flush against the bottom edge of the label.
CGSize imageSize = self.imageView.image.size;
self.imageView.frame = CGRectMake(20, CGRectGetMaxY(self.label.frame),
imageSize.width, imageSize.height);
}