我想用代码创建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)”
标签本身在预期坐标中渲染得很好。
答案 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;
}