UILabel 通过文字计算宽高
UILable *lable=[UILable alloc]init];
lable.text=@"hello world hello world hello world" //设置文本
UIFont *font=[UIFont systemFontOfSize:14]; //设置字体大小
CGSize contentSize=[lable.text boundingRectWithSize:CGSizeMake(200,MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size; //计算lable的大小 CGSizeMake(200,MAXFlOAT) 宽最大为200 高度不限
UIButton 图文混排
关于setTitleEdgeInsets和setImageEdgeInsets下面进行一些解释:
UIButton内有两个控件titleLabel和imageView,可以用来显示一个文本和图片,这里的图片区别于背景图片。给UIButton设置了title和image后,它们会图片在左边,文本在图片右边显示。它们两个做为一个整体依赖于button的contentHorizontalAlignment居左居右或居中显示。
显示格式区分:
1.当button.width < image.width时,只显示被压缩后的图片,图片是按照fillXY的方式压缩。
2.当button.width > image.width,且button.width < (image.width+text.width)时,图片正常显示,文本被压缩。
3.当button.width > (image.width+text.width)时,两者并列默认居中显示,可通过button的属性contentHorizontalAlignment改变对齐方式。
想改变两个子控件的显示位置,可以分别通过setTitleEdgeInsets和setImageEdgeInsets来实现。对titleLabel和imageView设置偏移是针对他当前的位置起作用的,并不是针对距离button边框的距离的。
typedefNS_ENUM(NSInteger, UIControlContentHorizontalAlignment) {
UIControlContentHorizontalAlignmentCenter =0,//居中
UIControlContentHorizontalAlignmentLeft =1,//居左
UIControlContentHorizontalAlignmentRight =2,//居右
UIControlContentHorizontalAlignmentFill =3,//
想两改变两个子控件的显示位置,可以分别通过setTitleEdgeInsets和setImageEdgeInsets来实现。需要注意的是,对titleLabel和imageView设置偏移,是针对它当前的位置起作用的,并不是针对它距离button边框的距离的。感觉设置不设置UIControlContentHorizontalAlignmentCenter居中都没有影响,这个网上也找了些相关的信息,感觉都没有说到重点,我这里也没有完全理解透彻,之前都是在设置setTitleEdgeInsets和setImageEdgeInsets这些参数时都是不停的尝试得到的结果。目前这是我理解后,代码实现最后的答案,希望可以帮到大家。
UIButton *btn=[UIButton alloc]init];
btn.frame=CGRectMake(50,50,300,50);
[btn setTitle:@"我是一个按钮" forState:UIControlStateNormal];
btn setImage:[UIImage imageNamed:@"tupian"] forState:UIControlStateNormal];
//设置文字偏移:向下偏移图片高度+向左偏移图片宽度 (偏移量是根据[图片]大小来的,这点是关键)
btn.titleEdgeInsets = UIEdgeInsets(btn.imageView.frame.size.height, -btn.imageView.frame.size.width,0, 0)
//设置图片偏移:向上偏移文字高度+向右偏移文字宽度 (偏移量是根据[文字]大小来的,这点是关键)
btn.imageEdgeInsets = UIEdgeInsets( -btn.titleLabel!.bounds.size.height, 0, 0, -btn.titleLabel.bounds.size.width)