`
dcj3sjt126com
  • 浏览: 1867061 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

layoutSubviews总结

    博客分类:
  • IOS
 
阅读更多

ios layout机制相关方法

  1. - (CGSize)sizeThatFits:(CGSize)size
  2. - (void)sizeToFit

——————-

  1. - (void)layoutSubviews
  2. - (void)layoutIfNeeded
  3. - (void)setNeedsLayout

——————–

  1. - (void)setNeedsDisplay
  2. - (void)drawRect

layoutSubviews在以下情况下会被调用:

1、init初始化不会触发layoutSubviews

   但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发

2、addSubview会触发layoutSubviews

3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

4、滚动一个UIScrollView会触发layoutSubviews

5、旋转Screen会触发父UIView上的layoutSubviews事件

6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

在苹果的官方文档中强调:

      You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.

 layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。

反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。

 刷新子对象布局

-layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写
-setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用
-layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局

在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]

重绘

-drawRect:(CGRect)rect方法:重写此方法,执行重绘任务
-setNeedsDisplay方法:标记为需要重绘,异步调用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘

 

sizeToFit会自动调用sizeThatFits方法;

sizeToFit不应该在子类中被重写,应该重写sizeThatFits

sizeThatFits传入的参数是receiver当前的size,返回一个适合的size

sizeToFit可以被手动直接调用

sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己

———————————-

layoutSubviews对subviews重新布局

layoutSubviews方法调用先于drawRect

setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews

layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的

 layoutIfNeeded遍历的不是superview链,应该是subviews链

drawRect是对receiver的重绘,能获得context

setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘

分享到:
评论

相关推荐

    iOS自定义控件开发梳理总结

    为了确保视图在大小改变时仍保持圆形,我们需要重写`layoutSubviews`方法,以调整子视图的frame和圆角半径。此外,还可以提供一个对外接口方法,如`configeWithImage:`,用于设置自定义控件的图像。 2. **使用xib...

    IOS面试题2018总结188题

    ### IOS面试题2018总结188题知识点概览 #### 1. Swift与Objective-C的区别 - **语法差异**:Swift 是一种更现代的语言,拥有许多新特性,如类型推断、模式匹配等。 - **内存管理**:Swift 使用自动引用计数 (ARC) ...

    ios-自定义TabBar(OC、Swift).zip

    总结,自定义TabBar在iOS开发中是一个常见的需求,通过修改TabBarItem的属性、调整TabBar的外观以及创建自定义的TabBarController,我们可以实现各种独特的设计。"FZHTabbarController"提供了一个现成的解决方案,...

    UINavigationBar Category

    总结来说,通过Objective-C的Category特性,我们可以优雅地扩展UINavigationBar的功能,解决自定义leftBarButtonItem点击区域过大的问题。这种方法避免了对系统类的直接修改,保持了代码的整洁和可维护性,同时也...

    ios-RoundTableviewCell.zip

    总结来说,实现类似iPad设置的圆角TableViewCell,需要对UITableViewCell的结构有深入理解,并熟练运用CALayer的属性。通过自定义背景视图、分割线以及调整内边距,我们可以创建出具有专业视觉效果的圆角cell。在...

    Layout管理类自动排布

    总结来说,"Layout管理类自动排布"是一个关于自定义布局管理类的主题,这个类能够自动化处理UI元素的排列,提供了一种高效、灵活的界面设计方式。ETSLayout的实现涉及到了C++编程和UI布局算法,对于理解和优化用户...

    ios-更换 tabBarItem的背景颜色.zip

    总结: 在iOS开发中,更换TabBarItem的背景颜色主要涉及到自定义TabBar类和调整TabBarItem的属性。通过上述步骤,你可以根据需求灵活定制TabBar的视觉效果,提升应用的用户体验。请记住,良好的界面设计不仅能吸引...

    iOS布局渲染之UIView方法的调用时机详解

    总结起来,iOS中的UIView生命周期与布局渲染紧密相关。理解这些方法的调用时机有助于优化性能,避免不必要的计算和渲染,从而提升应用的响应速度和用户体验。开发者应根据实际情况合理利用`updateConstraints`、`...

    NavigationBarWithShadowDemo 给导航条加上阴影(iOS)

    总结,"NavigationBarWithShadowDemo"是一个关于如何在iOS应用中为导航条添加阴影和自定义背景图片的示例项目。通过学习这个项目,开发者可以提升对自定义导航条能力的理解,丰富他们的UI设计技能,使应用界面更加...

    IOS封装纯代码和xib通用控件

    **四、总结** 通过上述步骤,我们成功地创建了一个既能纯代码编写,又能与XIB结合使用的自定义控件。这种方式提高了代码的灵活性,让开发者可以根据需求自由选择编程方式。在实际项目中,可以根据团队习惯和项目...

    XIB选项中中添加自定义属性

    总结一下,通过在Swift中创建自定义视图类,并利用`@IBInspectable`属性,我们可以在XIB文件中添加自定义属性,如圆角、边线宽度和边线颜色。这种方法大大增强了我们在设计界面时的灵活性,使得我们可以根据项目需求...

    定制UITableViewCell

    总结来说,自定义UITableViewCell涉及到继承、视图设计、数据绑定、事件响应和性能优化等多个方面。通过熟练掌握这些技巧,开发者可以打造出独特且高效的表格视图,提升应用的整体质量和用户体验。在实践中不断尝试...

    UIButton-XibLinesText-源码.rar

    总结,通过自定义UIButton子类、调整Xib布局和源码中的逻辑,我们可以使UIButton在Xib中支持多行文本显示。提供的源码“UIButton-XibLinesText-源码.zip”将包含以上所述的所有实现细节,是学习和参考的宝贵资源。...

    IOS应用源码——圆形时钟.rar

    总结一下,这个"IOS应用源码——圆形时钟.rar"提供了以下知识点: 1. iOS应用基本架构和UIViewController的使用。 2. 自定义UIView子类的创建与绘制,包括`draw(_ rect:)`、`updateTime()`和`layoutSubviews()`方法...

    Swift解决UITableView空数据视图问题的简单方法

    总结起来,解决Swift中的UITableView空数据视图问题,主要是通过创建一个协议和扩展UITableView,实现空数据视图的动态添加和移除。这样不仅保持了代码的整洁,也使得在多个地方复用这个功能变得更加容易。同时,...

    ios-UITableViewCell使用Masonry进行自动计算行高的问题.zip

    2. **更新约束**:在`layoutSubviews`方法中调用`layoutSubviews`或`updateConstraints`以确保Masonry可以正确计算约束。 3. **自动行高计算**:在`heightForRowAt`代理方法中,返回`UITableView.automaticDimension...

    iOS 环形进度条 progressView

    总结,创建一个自定义的iOS环形进度条控件"progressView"涉及对UIView的继承、Core Graphics的使用以及对动画和布局的理解。通过自定义这些视图,开发者可以为应用程序增添独特的视觉效果,同时提供直观的进度反馈,...

    swift-圆形视图(带圆角的视图)

    总结来说,创建带有圆角的视图在Swift中主要通过设置`UIView`的`layer.cornerRadius`和`clipsToBounds`属性,或者通过自定义视图实现更复杂的功能。在实际应用中,我们常常会结合其他UI组件,构建出丰富的用户界面。...

Global site tag (gtag.js) - Google Analytics