iOS控件使用和多样布局
一、得到字符串的宽度
- (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控件使用和多样布局相关推荐
- iOS控件之UILabel
原文链接: iOS控件之UILabel 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://github.com/Major ...
- DevExpress控件GridControl中的布局详解 【转】
DevExpress控件GridControl中的布局详解 [转] 2012-10-24 13:27:28| 分类: devexpress | 标签:devexpress |举报|字号 订阅 h ...
- 使用控件设计窗体 上 布局主窗体 添加标签与文本框控件
使用控件设计窗体 上 布局主窗体 添加标签与文本框控件 项目目标 所需控件 窗体基本设置 新建窗体 设置背景图片 设置平铺模式 设置icon 设置文字 修改名称 直接修改类名 标签控件与文本框控件 标 ...
- iOS 添加在scrollview的子控件,用masonry布局的问题
当在scrollview上添加子控件并用masonry布局时,发现运行后不是想要的布局,解决方法是需要添加一个view,上下左右,宽高.都要和scrollview一致.然后再在view上添加子控件即可 ...
- 如何设计一个 iOS 控件?(iOS 控件完全解析)
前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内 ...
- sketch里的ios控件_30个让你眼前一亮的iOS Swift UI控件!
前言 笔者接触 iOS 开发有一段时间了,尤其特别喜欢UI部分,特意收集整理了30个让你惊艳的第三方开源控件(swift),无论是应用到项目中还是用来学习都能让你大呼过瘾,废话不多说,直接上图上链接! ...
- ios 控件徽章_iOS 12 人机交互指南(七):栏(Bars)
要想发布一款能够位于App Store排行榜之首的产品,产品在质量和功能上的高标准表现是必不可少的,而为了达到这种高度,我们应该如何做呢?本文主要讲述的是 iOS 12 界面交互设计指南中的栏的部分, ...
- 【原创】DevExpress控件GridControl中的布局详解
在进行DevExpress控件GridControl的使用时,因控件的灵活性,所以用户会经常进行拖动控件的列,以达到自己满意的样式, 但下次再打开时系统就会重新还原到原有的布局风格,为了能够保持用户之 ...
- ios 控件切圆_iOS中 切圆角,任意几个角(带边框,不带边框)__OC和Swift版本 韩俊强的博客...
需求: 1.日常我们在切控件圆角时会遇到想切任意圆角? 2.切过圆角带边框和不带边框的选择? 那么今天我们就用Objective-C和Swift都给它实现了: OC代码: UILabel *myLab ...
- 07.移动先行之谁主沉浮----控件之轮流轰炸——布局类控件
如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 移动先行之谁主沉浮? 带着你的Net飞奔吧! 链接======>(点) 一.布局类控件 Grid.StackPanel. ...
最新文章
- nanodet学习笔记 tensorrt
- JavaScript算法相关
- Java 和 Android系统环境变量设置
- windows2000 ,windowsXP和windows2003共享页面文件
- Android开发问题集锦-Button初始为disable状态时自定义的selector不生效问题
- app嵌入jsp页面的项目工作量_好程序员Java学习路线分享jsp为什么用的不多了
- 光储充一体化充电站_【储能项目】国家电网与浙江瓯江口新区共建光储充一体化充电站项目...
- j2sdk jdk jre jvm的联系与区别
- 时钟指针角度。【问题描述】普通时钟都有时针和分针。在任意时刻,时针和分针都有一个夹角,并且假设时针和分针都是连续移动的。现已知当前的时刻,试求出在该时刻时针和分针的夹角A(0≤A≤180)。
- OutMan——面向对象的三大特性、对象和对象之间的关系以及动态类型检测方法
- 微软梁念坚:六个新潮流推动IT行业发展
- 图片降噪软件哪个好?不如试试Topaz DeNoise AI
- 学Excel函数公式,怎能不会这个组合套路? 1
- 压缩包文件跟html不一样,为什么压缩文件还是那么大
- python怎么设置dos_Windows下Python环境的配置和Dos界面的调用
- 局域网文件共享需要打开服务器,局域网共享工具有什么用怎么开启
- JQuery处理json数据实例(map和数组)
- 服务降级是什么?Spring Cloud如何实现?
- 机器学习之网格搜索技术,如何在Auto-sklearn中应用网格搜索技术
- 用计算机如何算瓷砖菱形加工,瓷砖菱形块怎么计算切图解
热门文章
- 计算机网络课程主机号怎么看,已知Ip地址_子网掩码如何计算子网号、主机号(收集整理)...
- html字体换成白色,css怎么把字体颜色改为白色
- WiFi技术概述:WiFi那些事
- 前端--阶段笔记(一)H5CSS3 新版
- 并发编程之AQS中的CLH队列
- AlphaGo灭了整个围棋界 下一步可能灭了散户跟交易员
- Vscode连接远程服务器出现‘Acquiring lock on/home/~’问题
- 纪念第一次面试安服-靶机测试过程以及思路
- 老照片还原当年穿着潇洒雷锋(组图)
- 基于PaddleX构建专属行车助手,为交通安全保驾护航