1

UILabel とその他の要素をコードで作成したいと考えています。UILabel のサイズはテキストによって変わる可能性があるため、それに応じて他の要素を移動する必要があります。どうすればそれを最も効果的に行うことができますか?境界プロパティにアクセスしようとしましたが、奇妙なことに、null です。

CGRect textRect = CGRectMake(20, 20, 280, 50);
label = [[UILabel alloc] initWithFrame:textRect];
label.text = someString;
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;    
[superView addSubview: label];
NSLog(@"bounds: %@", label.bounds);

「境界:(ヌル)」を出力します

ラベル自体は、予想される座標で適切にレンダリングされます。

4

2 に答える 2

5

境界プロパティは 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);
}
于 2012-08-03T20:15:45.323 に答える
0

-(UILabel *)lable:(UILabel *)label textSize:(NSInteger)size lableText:(NSString *)str {

 lable.numberOfLines=1;
 CGSize maximumSize = CGSizeMake(320,1000);//SetMaximumSize....
 UIFont *dateFont = [UIFont fontWithName:@"arial" size:size];
 lable.font=dateFont;

CGSize dateStringSize = [str sizeWithFont:dateFont 
                           constrainedToSize:maximumSize 
                               lineBreakMode:UILineBreakModeWordWrap];
lable.text=str;

CGRect dateFrame = CGRectMake(5,0,dateStringSize.width,dateStringSize.height);
lable.frame = dateFrame;

return label;

}

于 2012-08-04T08:26:16.713 に答える