UILabel 高度的计算
autolayout极大的方便了iOS的布局,但是碰到多变的页面,自动布局的方式就不如frame的布局方式了
不过使用frame布局一个多个view存在于UIScrollView中的页面,就需要去计算各个控件的高度。
单行的 UILabel
比如标题之类的 计算高度可以用 sizeWithAttributes
_titleLabel = ({
UILabel *label = [[UILabel alloc]init];
label.text = title;
label.font = [UIFont systemFontOfSize:15];
label.textAlignment = NSTextAlignmentLeft;
label;
});
[self addSubview:_titleLabel];
CGSize titleSize =[title sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]}];
多行的 UILabel
需要计算多行,并且随着屏幕宽度自动换行的 UILabel饰 就需要用 boundingRectWithSize
_descLabel = ({
UILabel *label = [[UILabel alloc]init];
label.text = desc;
label.font = [UIFont systemFontOfSize:14];
label.lineBreakMode = NSLineBreakByWordWrapping;
label.numberOfLines = 0;
label.textColor = [UIColor px_lightGray];
label;
});
[self addSubview:_descLabel];
CGSize descSize = [desc boundingRectWithSize:CGSizeMake(self.width-30, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} context:nil].size;
使用这两个方法的时候传入的参数 如字体样式 大小都要和创建的UILabel 一致才能计算准确
最后将 它们的高度和距离相加就是整个view的高度了。
UIProgressView 高度控制
补充纪录下 使用UIProgressView的时候 发现居然无法用frame来控制高度,只能控制宽度。
但是用autolayout就可以方便的控制高度了
查了很多资料 最后的解决方案类似html中的div的概念,先定义好一个区块,然后在区块中使用约束。
先用frame的方式定义好一个区块
_containView = ({
UIView *view = [[UIView alloc]init];
view;
});
[self addSubview:_containView]
-(void)layoutSubviews{
[super layoutSubviews];
_containView.frame = CGRectMake(40, _descLabel.bottom+80, self.width - 80, 6);
}
然后在区块中使用autolayout布局
_progressView = ({
UIProgressView *progressView = [[UIProgressView alloc]init];
progressView.trackTintColor= [[UIColor blackColor] colorWithAlphaComponent:0.3]; //背景颜色
if (!progressIsGood) {
progressView.progressTintColor = [UIColor colorWithRed:1.00 green:0.56 blue:0.42 alpha:1.00]; //进度条颜色
}else{
progressView.progressTintColor = [UIColor px_greenColor]; //进度条颜色
}
progressView.progress = progress;
progressView.layer.masksToBounds = YES;
progressView.layer.cornerRadius = 3;
progressView;
});
[_containView addSubview:_progressView];
[_progressView autoPinEdgesToSuperviewEdges];