一、得到字符串的宽度

- (NSArray *)dataArray {if (!_dataArray) {_dataArray = [NSArray array];_dataArray = @[@"君不见我的天",@"黄河之水天上来",@"奔流到海不复回",@"君不见",@"高堂明镜悲白发",@"朝如青丝暮成雪",@"人生得意须尽欢",@"莫使金樽空对月",@"天生我材必有用",@"千金散尽还复来",@"烹羊宰牛且为乐",@"会须一饮三百杯",@"岑夫子",@"丹丘生",@"将进酒",@"君不见",@"黄河之水天上来",@"奔流到海不复回",@"君不见",@"高堂明镜悲白发",@"朝如青丝暮成雪",@"人生得意须尽欢",@"莫使金樽空对月",@"天生我材必有用",@"千金散尽还复来",@"烹羊宰牛且为乐",@"会须一饮三百杯",@"岑夫子",@"丹丘生",@"将进酒"];}return _dataArray;
}

定义一个数组,使用- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSAttributedStringKey, id> *)attributes context:(nullable NSStringDrawingContext *)context API_AVAILABLE(macos(10.11), ios(7.0));方法就可以得到这个字符串的宽度

 for (int i = 0; i<30; i++) {NSString *string = self.dataArray[i];CGSize size = [string boundingRectWithSize:CGSizeMake(MAXFLOAT, 30) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:14.0]} context:nil].size;NSLog(@"%f",size.width);}

查看打印结果:

可以看到每个字符串的宽度

关于方法参数的介绍:

//参数一:size 表示计算文本的最大宽高

//参数二:表示计算的类型。

NSStringDrawingUsesLineFragmentOrigin绘制文本时使用 line fragement origin 而不是 baseline origin。一般使用这项

NSStringDrawingUsesFontLeading 根据字体计算高度

NSStringDrawingUsesDeviceMetrics 使用象形文字计算高度NSStringDrawingTruncatesLastVisibleLine 如果NSStringDrawingUsesLineFragmentOrigin设置,这个选项中没有用

//参数三:attributes 表示富文本的属性

二、实现输入框自适应高度

1.在实现自适应宽度之前,首先介绍两个方法

1)- (void)sizeToFit;

此方法会计算出最优的size并且改变自己的size

2)- (CGSize)sizeThatFits:(CGSize)size;

此方法会计算出最优的size但是不会改变自己的size

案例演示:

UILabel *textLabel = [[UILabel alloc]initWithFrame:CGRectMake(20, 300, 0, 0)];textLabel.backgroundColor = [UIColor grayColor];textLabel.font = [UIFont systemFontOfSize:20];textLabel.text = @"北京欢迎您";[textLabel sizeToFit];NSLog(@"width = %.1f height = %.1f",textLabel.frame.size.width,textLabel.frame.size.height);[self.view addSubview:textLabel];

查看打印结果:Label的原始宽高进行了变化

    UILabel *test1Label = [[UILabel alloc]initWithFrame:CGRectMake(20, 350, 0, 0)];
//    UILabel *test1Label = [[UILabel alloc]init];test1Label.backgroundColor = [UIColor redColor];test1Label.font = [UIFont systemFontOfSize:20];test1Label.text = @"北京欢迎您";CGSize sizeThatFits = [test1Label sizeThatFits:CGSizeZero];
//    test1Label.frame = CGRectMake(20, 350, sizeThatFits.width, sizeThatFits.height);NSLog(@"sizeThatFits: width=%.1f  height=%.1f", sizeThatFits.width, sizeThatFits.height);NSLog(@"width=%.1f  height=%.1f", test1Label.frame.size.width, test1Label.frame.size.height);

查看打印结果:sizeThatFits的值进行了变化,但是本身大小的值并没有改变

所以实现的效果,如果使用sizeThatFits方法,后面必须对frame进行重新赋值,不然宽高依旧是0,0(这里我设置的0,0),视图不显示

2.实现输入框自适应高度

便于演示,创建了一个xib,布局如下,包含一个textView,TextView里面加入了一个label。

1)加载xib,通过tag值找到textView和label控件

NSBundle *mainBundle = [NSBundle mainBundle];NSLog(@"%@",mainBundle);UIView *view = [[mainBundle loadNibNamed:@"CommentView" owner:nil options:nil] lastObject];view.frame = CGRectMake(20, 100, 375, 40);self.backView = view;[self.view addSubview:view];UILabel *label = [view viewWithTag:10];self.label = label;NSLog(@"label的文字是%@",self.label.text);UITextView *textView = [view viewWithTag:100];self.textView = textView;self.textView.delegate = self;

2)设置UITextViewDelegate代理,实现当文本改变时改变textView的高度

//输入时改变
- (void)textViewDidChange:(UITextView *)textView {if ([textView.text isEqualToString:@""]) {self.label.hidden = NO;}else {self.label.hidden = YES;}[self changeTextViewStyle:textView];
}
//改变TV样式
- (void)changeTextViewStyle :(UITextView *)TV {CGSize size = [TV sizeThatFits:CGSizeMake(TV.frame.size.width, MAXFLOAT)];NSLog(@"TV的高度是%f",size.height);if (size.height<TV.frame.size.height) {size.height = TV.frame.size.height;}//现在最高高度CGFloat maxHeight = TV.frame.size.height * 3;size.height = MIN(size.height,maxHeight);CGRect TVRect = TV.frame;TVRect.size.height = size.height;TV.frame = TVRect;
//    CGFloat TVSize = TV.frame.size.height;
//    TVSize = size.height;
//    TV.frame.size.height = TVSize;
//    CGFloat viewHeight = self.backView.frame.size.height;
//    viewHeight = size.height +10;CGRect viewRect = self.backView.frame;viewRect.size.height = size.height + 10;self.backView.frame = viewRect;
}

实现的结果:输入框的高度随文本的改变而改变

3)需要注意一下改变高度方法中 注释掉的部分,我们不能直接根据self.frame.size.height进行赋值,不然会报如下错误:表达式不能进行赋值,需要给一个中间变量


​​​​​​​

三、CAShapeLayer使用

1.CAShapeLayer继承自CALayer,需要和贝塞尔曲线配合使用才有意义

2.使用CAShapeLayer和贝塞尔曲线可以实现不在view的drawRect方法中画出一些想要的图形

3.CAShapeLayer和drawRect的区别:

drawRect:属于CoreGraphic框架,占用CPU,消耗性能大

CAShapeLayer:属于CoreAnimation框架,通过GPU来渲染图形,节省性能,动画渲染直接提交给手机GPU,不消耗内存

- (void)viewDidLoad {[super viewDidLoad];//创建pathUIBezierPath *bezi = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 50, 100, 100)];CAShapeLayer *layer = [[CAShapeLayer alloc]init];layer.path = bezi.CGPath;//路径的颜色layer.strokeColor = [UIColor redColor].CGColor;//填充色layer.fillColor = [UIColor greenColor].CGColor;//线宽layer.lineWidth = 15;//默认不设置是实线绘制,如果设置那么会虚线绘制,绘制前一个值是绘制虚线粗细,后一个值是间隔粗细layer.lineDashPattern = @[@20,@2];
//    baseView.layer.mask = layer;[self.view.layer addSublayer:layer];}

实现的效果:

​​​​​​​

1.直接给Label设置文字

实现的效果如下:

2.设置文字样式

UILabel *jieshaoLabel = [[UILabel alloc]init];

jieshaoLabel.numberOfLines = 0;

NSString *jieshaoStr = @"植物花园是一款针对喜爱养花的人设计的app,用户可以添加鲜花,可以对花定期的进行浇水,可以看到自己的养护记录,清楚,简便";

NSMutableAttributedString *text = [[NSMutableAttributedString alloc]initWithString:jieshaoStr];

NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc]init];

//其余行缩进

style.headIndent = 0;

//第一行缩进

style.firstLineHeadIndent = 22;

//行距

style.lineSpacing = 10;

[text addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, text.length)];

jieshaoLabel.attributedText = text;

jieshaoLabel.font = [UIFont systemFontOfSize:14];

jieshaoLabel.textColor = [UIColor grayColor];

[backView addSubview:jieshaoLabel];

[jieshaoLabel mas_makeConstraints:^(MASConstraintMaker *make) {

make.left.mas_equalTo(20);

make.right.mas_equalTo(-20);

make.top.mas_equalTo(nameLabel.mas_bottom).offset(20);

}];

实现的效果:

3.使用NSMutableAttributedString对文本进行设置

NSString *s = [NSString stringWithFormat:@"目前已错%ld个字",(long)self.errorNum];

NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc]initWithString:s];

//文字的整体字号

[attributeString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:14] range:NSMakeRange(0, 7)];

//前4个文字的颜色

[attributeString addAttribute:NSForegroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange(0, 4)];

//第5个文字的颜色

[attributeString addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(4, 1)];

//第6-7个文字的颜色

[attributeString addAttribute:NSForegroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange(5, 2)];

UILabel *label_b = [[UILabel alloc]init];

label_b.frame = CGRectMake(20, 20, 100, 40);

label_b.numberOfLines = 0;

label_b.attributedText = attributeString;

[self addSubview:label_b];

实现的效果如下:

这样就可以实现中间的第5个字颜色不一样,为红色。

iOS控件使用和多样布局相关推荐

  1. iOS控件之UILabel

    原文链接: iOS控件之UILabel 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://github.com/Major ...

  2. DevExpress控件GridControl中的布局详解 【转】

    DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28|  分类: devexpress |  标签:devexpress  |举报|字号 订阅 h ...

  3. 使用控件设计窗体 上 布局主窗体 添加标签与文本框控件

    使用控件设计窗体 上 布局主窗体 添加标签与文本框控件 项目目标 所需控件 窗体基本设置 新建窗体 设置背景图片 设置平铺模式 设置icon 设置文字 修改名称 直接修改类名 标签控件与文本框控件 标 ...

  4. iOS 添加在scrollview的子控件,用masonry布局的问题

    当在scrollview上添加子控件并用masonry布局时,发现运行后不是想要的布局,解决方法是需要添加一个view,上下左右,宽高.都要和scrollview一致.然后再在view上添加子控件即可 ...

  5. 如何设计一个 iOS 控件?(iOS 控件完全解析)

    前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内 ...

  6. sketch里的ios控件_30个让你眼前一亮的iOS Swift UI控件!

    前言 笔者接触 iOS 开发有一段时间了,尤其特别喜欢UI部分,特意收集整理了30个让你惊艳的第三方开源控件(swift),无论是应用到项目中还是用来学习都能让你大呼过瘾,废话不多说,直接上图上链接! ...

  7. ios 控件徽章_iOS 12 人机交互指南(七):栏(Bars)

    要想发布一款能够位于App Store排行榜之首的产品,产品在质量和功能上的高标准表现是必不可少的,而为了达到这种高度,我们应该如何做呢?本文主要讲述的是 iOS 12 界面交互设计指南中的栏的部分, ...

  8. 【原创】DevExpress控件GridControl中的布局详解

    在进行DevExpress控件GridControl的使用时,因控件的灵活性,所以用户会经常进行拖动控件的列,以达到自己满意的样式, 但下次再打开时系统就会重新还原到原有的布局风格,为了能够保持用户之 ...

  9. ios 控件切圆_iOS中 切圆角,任意几个角(带边框,不带边框)__OC和Swift版本 韩俊强的博客...

    需求: 1.日常我们在切控件圆角时会遇到想切任意圆角? 2.切过圆角带边框和不带边框的选择? 那么今天我们就用Objective-C和Swift都给它实现了: OC代码: UILabel *myLab ...

  10. 07.移动先行之谁主沉浮----控件之轮流轰炸——布局类控件

    如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 移动先行之谁主沉浮? 带着你的Net飞奔吧! 链接======>(点) 一.布局类控件 Grid.StackPanel. ...

最新文章

  1. nanodet学习笔记 tensorrt
  2. JavaScript算法相关
  3. Java 和 Android系统环境变量设置
  4. windows2000 ,windowsXP和windows2003共享页面文件
  5. Android开发问题集锦-Button初始为disable状态时自定义的selector不生效问题
  6. app嵌入jsp页面的项目工作量_好程序员Java学习路线分享jsp为什么用的不多了
  7. 光储充一体化充电站_【储能项目】国家电网与浙江瓯江口新区共建光储充一体化充电站项目...
  8. j2sdk jdk jre jvm的联系与区别
  9. 时钟指针角度。【问题描述】普通时钟都有时针和分针。在任意时刻,时针和分针都有一个夹角,并且假设时针和分针都是连续移动的。现已知当前的时刻,试求出在该时刻时针和分针的夹角A(0≤A≤180)。
  10. OutMan——面向对象的三大特性、对象和对象之间的关系以及动态类型检测方法
  11. 微软梁念坚:六个新潮流推动IT行业发展
  12. 图片降噪软件哪个好?不如试试Topaz DeNoise AI
  13. 学Excel函数公式,怎能不会这个组合套路? 1
  14. 压缩包文件跟html不一样,为什么压缩文件还是那么大
  15. python怎么设置dos_Windows下Python环境的配置和Dos界面的调用
  16. 局域网文件共享需要打开服务器,局域网共享工具有什么用怎么开启
  17. JQuery处理json数据实例(map和数组)
  18. 服务降级是什么?Spring Cloud如何实现?
  19. 机器学习之网格搜索技术,如何在Auto-sklearn中应用网格搜索技术
  20. 用计算机如何算瓷砖菱形加工,瓷砖菱形块怎么计算切图解

热门文章

  1. 计算机网络课程主机号怎么看,已知Ip地址_子网掩码如何计算子网号、主机号(收集整理)...
  2. html字体换成白色,css怎么把字体颜色改为白色
  3. WiFi技术概述:WiFi那些事
  4. 前端--阶段笔记(一)H5CSS3 新版
  5. 并发编程之AQS中的CLH队列
  6. AlphaGo灭了整个围棋界 下一步可能灭了散户跟交易员
  7. Vscode连接远程服务器出现‘Acquiring lock on/home/~’问题
  8. 纪念第一次面试安服-靶机测试过程以及思路
  9. 老照片还原当年穿着潇洒雷锋(组图)
  10. 基于PaddleX构建专属行车助手,为交通安全保驾护航