`
dcj3sjt126com
  • 浏览: 1829866 次
  • 性别: 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中UIView的layoutSubviews子视图布局方法使用

    主要介绍了iOS中UIView的layoutSubviews子视图布局方法使用,文中举了一个layoutSubviews在iPad横竖屏切换时被调用用来重新布局的实例,需要的朋友可以参考下

    DSCollectionView

    索引条部分使用UIView 的 layoutSubviews绘制字母和边框线 setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。而setNeedsLayout会默认调用layoutSubViews,就...

    swift——自定义UITabBar,UITabBarController和UINavigationController

    自定义UITabBar,layoutSubviews重写UITabBarButton位置,重写则hitTest方法并监听按钮的点击 自定义的UITabBarController和UINavigationController

    ios-个性化TabBar.zip

    需求: 中间按钮 需要个性化 思路 : 利用KVC 对 TabBarController 的 tabBar 赋值 然后 子类化 UITabBar 重写 layoutSubviews 找到 UITabBarButton 重新布局

    iOS开发中TabBar再次点击实现刷新效果

    需求 之前已经实现了自定义TabBar,如图所示:   自定义TabBar.jpeg 现在需要实现一个类似今日头条TabBar的功能 —— 如果继续点击当前...1. 自定义TabBar的layoutSubviews中绑定事件 - (void)layoutSubviews { [supe

    自定义警告框、弹出框AlertView

    自定义警告框、弹出框AlertView 自定义AlertView 实现自定义UIAlertView。继承UIAlertView,改写其中的layoutSubviews方法,用于自定义UIAlertView的外观

    zhengjie19901102#Objective-C#IOS购物车UIButton版本1

    IOS购物车UIButton版本备忘笔录UIButton代码://别忘了调用父类的layoutSubviews方法//设置图片及文字的位置大小//获取数据进按钮

    快速的微框架,用于在功能上声明自动布局约束-Swift开发

    您可以在Interface Builder中使用“自动布局”,可以在代码中使用“自动布局”并维护对这些约束的引用,或者可以使用layoutSubviews实现布局功能。 这些方法中的每一种都有优点和缺点。 如果您使用layoutSubviews...

    Storybook-ios:用于在iOS中更快地进行UI开发的UI组件预览器(当前仅支持UIKit)

    适用于iOS的故事书 适用于iOS的Storybook是一个可提高UI开发速度的库。 它使我们能够独立预览UI可以显示的每个状态的组件。... public override func layoutSubviews () { super . layoutSubviews () backgroundColo

    JZLTabBar:自定义类似淘宝TabBar

    2018.7.7更新 1.更改masonry约束布局为frame布局 2.支持设置角标 3.支持自定义角标颜色和背景颜色 4.支持清除角标 自定义类似淘宝TabBar 公司的项目需求是tabbar和...- (void)layoutSubviews { [super layoutSubviews];

    自定义tabbar,简单,易用

    自定义tabBar,简单,易用 使用说明: 1.修改初始化数据 #pragma mark 初始化数据 在 -(instancetype)init 方法里面 2.修改底部图片文字布局 在TabBarButton.m 文件的 layoutSubviews 方法里面

    ios-纯代码封装性搭建新浪微博框架.zip

    7.自定义的tabbar类的的UITabbarItem的layoutSubViews方法中布局所有的字视图; 8.记录按钮的tag,设置当前选中按钮,同时在按钮事件中设置选中和取消选中状态; 9.在tabbar类设置代理,回传选中按钮的tag,用来...

    自定义带有UITableView的UIAlertView

    项目中用到带有带有UITableView的UIAlertView,刚开始的做法 是 UIAlertView 的基础上addsubview上UITableView,...重写了 layoutSubviews方法,可以用于横竖屏切换 ,UITableView的位置大小 在 UIAlertView内。

    Modern Auto Layout.zip

    How to subclass UIView and make friends with layoutSubviews How to build programmatic layouts without storyboards What is Auto Layout? What is a constraint? Who owns a constraint? How many ...

    一款实现封面流动的效果

    在使用这份代码时遇到一点问题,提出了他自己的解决方案:这个代码中reloaddata后,调用layoutsubviews应移除掉之前的subviews,然后加上[[_scrollView subviews] makeObjectsPerformSelector:@selector...

    DYChart

    Semi Chircle仪表板示例: let dashCircle = DYDashboardCircle()dashCircle.value(to: 0.9, animated: true)dashCircle.layoutSubviews()view.addSubview(dashCircle)其他配置: var circleColors: [UIColor]任何...

    Paged Flow View(iPhone源代码)

     @flycent_stars 在使用这份代码时遇到一点问题,提出了他自己的解决方案:这个代码中reloaddata后,调用layoutsubviews应移除掉之前的subviews,然后加上[[_scrollView subviews] makeObjectsPerformSelector:@...

    iOS 将系统自带的button改装成上图片下文字的样子

    代码是通过继承UIButton,然后再重写layoutSubviews方法,对自带的图片和titleLabel进行重新的layout,代码如下: // // ZZZUpDownButton.h // // Copyright :copyright: 2016年 George. All rights reserved. // /...

    LayoutLoopHunter:基于运行时的设置,用于跟踪自动布局反馈循环

    LayoutLoopHunter 该库通过在实时代码中复制UIViewLayoutFeedbackLoopDebuggingThreshold的行为来帮助捕获由自动布局反馈循环引起的OOM。 这是上的运行时教程的最终... 当在单个运行循环中多次调用layoutSubviews

Global site tag (gtag.js) - Google Analytics