首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS性能优化系列篇之“列表流畅度优化”

CPU创建view,设置其属性(frame、background color等等) * **创建backing images**。...WWDC 2018中讲到了一个iOS12的底层优化点,苹果工程师在性能调优的时候发现一个导致丢帧的奇怪case,在没有其他后台线程运行、只有滑动的情况下,会比有少量的后台线程的情况更容易掉帧。...可在子线程中进行的任务 * 图片解码 * 文本渲染,UILabel和UITextview都是在主线程渲染的,当显示大量文本时,CPU的压力会非常大。...尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText...,在iOS8之后,UILabel使用的是CALayer作为底图层,而在iOS8开始,UILabel的底图层变成了\_UILabelLayer,绘制文本也有所改变。

2.6K30

iOS坐标系探究

正文 我们先从一段最简单的代码入手,在drawRect中显示一个普通的UILabel; 为了方便判断,我把整个view的背景设置成黑色: - (void)drawRect:(CGRect)rect {...,然后设置文本,显示到屏幕上,没有修改坐标。...从这个不同的现象开始,我们来理解iOS的坐标系。 坐标系概念 在iOS中绘制图形必须在一个二维的坐标系中进行,但在iOS系统中存在多个坐标系,常需要处理一些坐标系的转换。...用我们在Windows常用的画图来参考,当我们使用画笔在白板中写字时,图形上下文就是画笔的属性设置、白板大小、画笔位置等等。...iOS可以使用CGContextSaveGState()方法暂存context状态,然后在CoreText绘制完后通过CGContextRestoreGState ()可以恢复context的变换。

2.8K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    在iOS中如何正确的实现行间距与行高

    关于行间距 lineSpacing 先贴出一张 iOS 中 UILabel 的默认排版样式: ? 大家也都能看出来,默认的排版样式中,文本的行间距很小,显得文本十分挤。...设计师是想要蓝色区域高度为 10pt,而我们直接设置 lineSpacing 会将两行红色区域中间的绿色区域高度设置为 10pt,这就是问题的根源了。 那么这个红色的区域高度是多少呢?...这时候我们可以通过设置 lineHeight 来使得每一行文本的高度一致,lineHeight 设置为 30pt 的情况下,一行文本高度一定是 30pt,两行文本高度一定是 60pt。...在 debug 模式下确认了下文本的高度的确正确的,但是为什么文字都显示在了行底呢? 修正行高增加后文字的位置 修正文字在行中展示的位置,我们可以用 baselineOffset 属性来搞定。...好在我们通常是行高和行间距针对不同的需求分别独立使用的,它们在分开使用时不会触发这个问题。所以在 VirtualView-iOS 库中,我暂且将高度计算的逻辑保持和系统一致了。

    4.4K30

    深入详解iOS适配技术

    前言 iPhone自诞生以来,随着其屏幕尺寸不断的多样化,屏幕适配的技术一直在发展更新。...目前,iOS系统版本已经更新到9.3,XCode的最新版本已经是7.3,仅iPhone历史产品的尺寸就已经有4种:3.5英寸、4.0英寸、4.7英寸、5.5英寸。...比如,给某个子控件A设置了左边距和右边距后,虽然没有明确指定子控件A的宽度,但是其左右边距一旦设置,那么宽度可以根据子控件A和父控件左右之间的边距自动推算出来。...就是警告 > 警告代表着当前控件在storyBoard中呈现的位置或者尺寸和程序运行后实际呈现的效果不一样,导致约束警告的原因往往是没有更新控件的约束,但并不影响其真实效果,也不会报错。...,多数使用storyBoard中的autolayout设置约束,只有在万不得已的情况下才用代码设置autolayout约束,这种情况一般是,被约束的控件是代码创建的,或者被约束的控件的父控件是代码创建的

    8.5K70

    Ios常用第三方框架(一)

    Snap支持iOS和OS X。 SnapKit - 就是“snap”, --swift 喜欢自动布局吗?当然喜欢!至少在storyboard中创建时会喜欢。...在代码中纯手工创建约束灰常痛苦,但幸运的是我们有了SnapKit,在board中用上它,你可以简单直观地编写约束了。...Cartography - Cartography 是用来声明 Swift 中的 Auto Layout,无需输入任何 stringly 就可设置自己 Auto Layout 的约束声明。...FXLabel - FXLabel是一个功能强大使用简单的类库,通过提供一个子类改进了标准的UILabel组件,为字体增加了阴影、内阴影和渐变色等,可以被用在任何标准的UILabel中。...KMPlaceholderTextView - 可显示多行 placeholder 的 textView,可以在IB里面设置 -- swift。

    5.5K31

    有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?

    Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layout到Size Class,每一次的更新,都会给iOS应用的开发带来不小的便利.但是,对于绝对多数iOS攻城狮来说...,根据数量动态计算高度;转发部分同理;然后根据数据在tabelView的代理方法 tableView:heightForRowAtIndexPath: 中动态返回高度即可.是的,思路就是这么个思路,但是你确定产品经理一直不会改需求...在 tableView:heightForRowAtIndexPath: 中计算高度时,是有坑的,对于刚接触iOS的攻城狮来说,几乎是难以理解的诡异问题.这里简单说两个,其他的大家可跟帖补充: 1.文字高度计算时....由于浮点数四舍五入机制的存在,所以偶现UILabel最后一行无法显示的情况.原因也很诡异: 在你计算时,部分值会存在稍许的不超过0.01的误差,大多数情况下,这个误差值,可以安全忽略,但是确实存在那0.01...,然后计算cell高度.然后你会发现,凡是稍微涉及到图片显示的界面,你的显示是对的,但是滚动非常卡顿,因为你在自己浑然不觉的情况下创建了N个Cell,而且这些Cell绝对不会参与复用.

    92260

    iOS 性能优化

    在这种情况下,GPU 会预先渲染一帧放入一个缓冲区中,用于视频控制器的读取。当下一帧渲染完毕后,GPU 会直接把视频控制器的指针指向第二个缓冲器。 ?...卡顿监控 1.Instruments 在开发阶段,使用内置的性能工具instruments来检测性能问题是最佳的选择,正常情况下,CPU会周期性的提交要渲染的图像信息给GPU处理,保证视图的更新。...常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。...尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText...这样,TableView 在请求各个高度函数时,不会消耗任何多余计算量;当把 CellLayout 设置到 Cell 内部时,Cell 内部也不用再计算布局了。

    2.9K20

    记一次 contentInsetAdjustmentBehavior 引发的bug

    1 背景 项目中使用到了UILable来展示相关的文本内容,但内容的大小不确定,有可能会超过屏幕的大小,因此需要在外层嵌套一个UIScrollView来保证内容可以被完全展现给用户,在UILabel确定相关的高度后...3 问题的分析 在发现实现的效果没有达到想要的效果后,就开始进入问题的分析排查阶段。...3.2 排查方向二 在发现不是初始y值的影响后,就猜测大概率是父View的影响,仔细查看了父View的设置代码后,发现其并没有设置顶部Top的距离,一行行代码排查后,怀疑是ContentSize的设置引起的...这不科学啊,这个只是用来设置可滚动范围的接口啊,难道是我设置的高度太多了?但在尝试设置了多个不同的高度后,发现都没有解决问题。让我有点怀疑人生了。...scrollableAxes:只调整在可滚动方向的 never : 不调整 always :在调整内容时,自己调整 并且在iOS 11以上的系统,该属性的默认值为always,也就是说在你调整它的contentSize

    82320

    Cell 动态行高文字显示不全问题探索

    问题概述 使用的是”预估行高+自动布局“的方法实现动态行高(适用于 iOS7.0 以后系统)。...,需要保证如下设置: 设置 label 的 numberoflines 为 0 对 label 进行上左下右的完整约束 在项目实现过程中,遇到了文本内容被截断最后一行一小部分,无法完全显示的问题。...计算拿出结果后缓存。在 cell 显示之前,setFrame 生效,此时,cell 在之前预估行高的基础上,根据约束重新布局,舍弃了内容 label 的高度约束,导致内容显示不全。...其他解决思路 当然,为了实现行分割线效果,我们也可以在自定义 cell 的底部手动添加一个 UIView 子视图,高度设置为 cell 间隔高度,颜色改为与 UITableview 背景色一致(与 cell...这种方法就不会因为重写 cell 的 setFrame 方法导致多行文字显示不全了。

    2.3K00

    UI篇-CATextLayer和 富文本的交融

    ,它的功能远比 UIlablel 强大的多的多,其最主要的特点是CATextLayer可以被NSMutableAttributedString直接附值。...在使用中通过将AttributedString赋值给控件的 attributedText 属性来添加文字样式。有属性的控件有UILabel、UITextField和UITextView。...greenColor]; //自动换行 label.numberOfLines = 0; //设置label的富文本 label.attributedText = attrStr; //label高度自适应...; //label高度自适应[label sizeToFit]; [self.view addSubview:label]; 文本属性Attributes 1.直接上干货,多个属性可以一同使用 //...1竖直 0水平 在iOS没卵用,不支持竖版 2.设置段落样式:段落样式中允许你设置文字与文字之间的行间距、字符间距、以及对齐模式,但是注意的是,在设置段落样式的时候,必须保证控件的 numberofline

    2.6K10

    Cell 动态行高文字显示不全问题探索

    ,需要保证如下设置: 设置 label 的 numberoflines 为 0 对 label 进行上左下右的完整约束 在项目实现过程中,遇到了文本内容被截断最后一行一小部分,无法完全显示的问题。...二、尝试复现问题 隐藏系统cell分割线:self.gTV.separatorStyle = UITableViewCellSeparatorStyleNone; 同时,在自定义cell中重写 setFrame...但是,当我尝试设置底部约束的为 >= 9+8=17,再运行,居然就是我想要的效果: ? ? 分析:系统先在 setFrame 生效之前,对 cell 内的上下所有约束进行行高预估。计算拿出结果后缓存。...在 cell 显示之前,setFrame 生效,此时,cell 在之前预估行高的基础上,根据约束重新布局,舍弃了内容 label 的高度约束,导致内容显示不全。...其他解决思路 当然,为了实现行分割线效果,我们也可以在自定义 cell 的底部手动添加一个 UIView 子视图,高度设置为 cell 间隔高度,颜色改为与 UITableview 背景色一致(与 cell

    1.9K20

    iOS 优化界面流畅的技巧

    Autolayout Autolayout 是苹果本身提倡的技术,在大部分情况下也能很好的提升开发效率,但是 Autolayout 对于复杂视图来说常常会产生严重的性能问题。...常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。...尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText...CellLayout 包含所有文本的 CoreText 排版结果、Cell 内部每个控件的高度、Cell 的整体高度。...这样,TableView 在请求各个高度函数时,不会消耗任何多余计算量;当把 CellLayout 设置到 Cell 内部时,Cell 内部也不用再计算布局了。

    1.5K10

    1.注册或登录页面设计:UILabel,UIButton,UITextField

    学习iOS开发已经有一段时日了,之前一直没有系统的对iOS开发的相关知识进行归纳总结,导致很多知识点云里雾里在脑子里形不成iOS开发的思想,现将自己在学习过程中遇到的一些知识进行总结,希望能对iOS初学者能有一定的帮助...一.注册或登录界面 如下图,实现了一个注册或登录界面,这里先只介绍单个页面,不介绍点击“完成”按钮后的动作,在之后的系列《iOS开发入门总结》中会逐步介绍,等基础知识介绍的差不多了,就可以以一个完整的注册系统作为小结...说明: 这里为了展现UITextField的文本框关联键盘的设置,这里把“密码”和“确定密码”的关联键盘都设置为数字键盘,实际应用中密码一般都允许为数字或字母。 实现了键盘收回操作。...UILabel中文本的行数,其属性值默认为1,用于设置该UILabel只能显示一行文本。...[UIColor redColor]; //输入框中是否有个叉号,在什么时候显示,用于一次性删除输入框中的内容 text.clearButtonMode = UITextFieldViewModeAlways

    2.4K50

    【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )

    几行 文字 , Lines 属性 设置 0 就会自动进行换行 ; 2.UILabel 行高设置 : 自动换行的前提是 , UILabel 有对应的多行的行高 , 如果 UILabel 高度很小只能显示...1 行 , 那么 UILabel 自动换行 也只是显示 1 行 , 因此 如果需要自动换行的话 , 需要给 UILabel 设置足够的行高 ; 3.宽高控制 : UILabel 的 宽度 和 高度..., 点击 Create 进行下一步 ; 4.Xcode 设置 : 其 文件 创建在了 代码目录下 , Xcode 中的引用 放在了根目录 , 此时 将其拖动到 代码路径中即可 ; 设置完毕后的情况...中的 .app 文件路径 : 在 Bundle 目录下 , Application 路径 下 的 二级 文件 就是 iOS 中的 app 后缀文件 , 右键 可查看其 内容 ; 6.查看 Bundle...; 3.读取 plist 频率 : 一般情况下 程序 运行起来 , plist 是不会改变的 , 因此 只需要加载一次即可 ; 根据 没有值 的时候才去 初始化 原则 , 只有当属性为 空时 , 才执行初始化操作

    4K40

    UI篇-UICollectionView 补充

    ---- 也可以自定义一个 继承于 UICollectionViewFlowLayout 的约束,在自定义的约束中实现更强大的功能。比如这样的: ?...indexPath]; 最主要的是返回一个 item 的具体Frame attri.frame = CGRectMake(cellX, cellY, cellWidth, cellHeight); 实例中在自定义的方法中高度返回的是随机值...endInteractiveMovement() 在完成手势动作后,结束交互式移动 cancelInteractiveMovement() 取消Interactive Movement。...—————— 瀑布流可以在保证图片原始比例的情况下,灵活的展现内容,相对于传统的使用相同大小的网格展现大量图片,效果上要好上很多,而实现瀑布流的方式有很多种,网上比较流行的有三种实现方式。...使用UICollectionView,UICollectionView在iOS6中第一次被介绍,它与UITableView有许多相似点,但它多了一个布局类,而实现瀑布流,就与这个布局类有关。

    1.5K20

    【iOS 开发】iOS 开发 简介 (IOS项目文件 | MVC 模式 | 事件响应机制 | Storyboard 控制界面 | 代码控制界面 | Retina 屏幕图片适配)

    (6) Drawing 属性 Drawing 属性 :  -- Opaque : 设置控件是否为 不透明, 如果设置为不透明, 不管该控件的透明度是否是半透明, 该控件后的其它控件将不会被绘制; --...: 在 Text 属性下面有一个文本框, 在这个文本框中输入要显示的文本内容; (2) Color 属性 Color 属性 : 控制 UILabel 中的文本颜色; (3) Font 属性 Font...是否可用, 如果没有勾选, 该 Label 不可用, 处于淡灰色; -- Highlighted : 控制 UILabel 是否处于高亮状态, 勾选该控件后处于高亮状态, 控件中的文本以高亮显示; (...Size : 设置最小的字号大小, 设置的值是字体大小; -- Tighten Letter Spacing : 勾选该复选框 会自动压缩字符串中的空白, 保证 UILabel 能容纳这些文本中的内容...IOS 图标设置 IOS 图片设置 : 直接从文件目录将图片拖动到 Xcode 相应的设置中. -- 设置图标 : 在项目文件视图中, 点击 Images.xcassets, 选中左侧的 AppIcon

    5K30

    iOS-屏幕适配实现(AutoLayout)

    375的屏幕宽度,你不能距离左边200,距离右边200,还要控件宽度100,肯定不行) 黄色箭头,代表约束警告,表示当前控件在xib中呈现的位置或者尺寸和程序运行后实际呈现的效果不一样,导致约束警告的原因往往是没有更新控件的约束...,但并不影响其真实效果,也不会报错 注意:约束有错误,不代表运行会错误,约束错误同样可以运行 约束的规则 相对于父视图的约束,添加到父视图上 对于两个同层级 view 之间的约束关系,添加到它们的父 view...如果我们通过约束给定了UILabel的width = 100,但是内容仍然少的可怜,不能包裹,可以把宽度设置为高度的设置同理可证。...原因在于,UILabel是根据内容自动调整宽度和高度,如果没有内容,那么宽度和高度就是0,导致UILabel无法显示。...Safe Area : iOS11中增加的,safe area 可以看作是系统在所有的 view 上加了一个虚拟的 view, 这个虚拟的 view 的大小等都是跟 view 的位置等有关的(当然是在

    44010
    领券