自动化的UILabel界限

时间:2012-08-03 19:54:15

标签: iphone objective-c cocoa-touch

我想用代码创建UILabel和其他一些元素。 UILabel大小可以根据文本而改变,因此我必须相应地移动其他元素。我怎样才能最有效地做到这一点?我尝试访问bounds属性,但奇怪的是,它是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);

打印出“bounds:(null)”

标签本身在预期坐标中渲染得很好。

2 个答案:

答案 0 :(得分:5)

bounds属性是CGRect。 CGRect不是Objective-C对象,因此您无法使用%@直接打印它。您需要先使用NSStringFromCGRect将其转换为字符串:

NSLog(@"bounds: %@", NSStringFromCGRect(label.bounds));

处理UILabel及其周围元素的最佳方法是创建一个自定义UIView子类来包含标签和其他元素,并覆盖其layoutSubviews方法做布局。

例如,假设我们想要标签和图像视图,我们希望图像视图与标签的底边齐平。我们可以创建一个名为UIView的{​​{1}}子类:

ContainerView

我们可以将其用作标签的超视图和图像视图。我们将依赖于ContainerView来布局标签和图像,因此我们不需要指定它们的帧。我们还将依赖ContainerView将标签和图像视图添加为子视图。

@interface ContainerView : UIView

@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) UIImageView *imageView;

@end

以下是我们如何实现ContainerView(假设我们正在使用ARC):

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的'label'setter,将标签添加为子视图:

@implementation ContainerView

@synthesize label = _label;
@synthesize imageView = _imageView;

我们对'imageView'设置器也这样做:

- (void)setLabel:(UILabel *)label {
    if (_label) {
         [_label removeFromSuperview];
    }
    _label = label;
    if (_label) {
        [self addSubview:label];
    }
}

有趣的部分是- (void)setImageView:(UIImageView *)imageView { if (_imageView) { [_imageView removeFromSuperview]; } _imageView = imageView; if (_imageView) { [self addSubview:imageView]; } } 方法。系统会在不同时间向视图发送layoutSubviews消息,包括在获取新子视图及其大小发生变化后。

layoutSubviews

答案 1 :(得分:0)

- (UILabel *)标签:(UILabel *)标签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;

}