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

最好在约束更改之前或之后调用.layoutIfNeeded()

在约束更改之前或之后调用.layoutIfNeeded()的目的是强制布局更新,确保界面在约束更改生效后能够正确地展示。

在iOS开发中,使用Auto Layout布局时,通过添加约束来定义视图的位置和大小关系。当需要修改约束时,我们可以通过更新视图的约束来实现。但是,由于布局更新是异步执行的,所以在修改约束后,界面并不会立即更新,需要等待下一次布局更新周期才会生效。

在这种情况下,我们可以调用.layoutIfNeeded()方法来立即强制执行布局更新。该方法会立即触发视图的布局更新过程,将修改后的约束应用到视图上,使其立即展示出变化后的样式。

推荐腾讯云相关产品:无

参考链接:

  • .layoutIfNeeded()官方文档:https://developer.apple.com/documentation/uikit/uiview/1622621-layoutifneeded
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

setNeedsLayout和layoutIfNeeded看我就懂!

您可能会想知道为什么在我们进行约束更改之前呢。苹果认为这是一个最佳做法,以确保任何以前的更新等待更新周期的完成,所以我已经添加了它。...由于此布局同步发生,因此在动画块中捕获来自约束更改的帧移动,因此如果您现在运行应用程序,则可以看到红色视图在2秒钟内如何变大变小。 效果如下: ?...净效果是在动画块中不会发生动画,因为该块中的视图没有更改。 效果如下: ? 在这种情况下单击按钮将立即根据更新的约束更新视图大小,而不是动画更新。...** 因此,由于我们的代码已经标记该视图需要通过setNeedsLayout进行布局更新,所以是在更新周期中立即启动视图更新,而不是从更新周期开始约束更改和帧移动的动画。...) 如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局 在视图第一次显示之前,标记总是“需要刷新”的

2.7K90

谈谈 Autolayout

layoutSubViews: 当 View 及其所有子视图的 frame 发生改变的时候,会调用 layoutSubviews,所以在需要更新 frame 来重新定位更改大小时重载它。...layoutIfNeeded 调用 layoutIfNeeded 会触发 layoutSubviews,告知页面布局立刻更新,所以一般都会和 setNeedsLayout 一起使用。...通常在 updateConstraints 方法中实现必须要更新的约束,在设置或者解除约束更改约束的优先级或者常量值,或者从视图层级中移除一个视图时都会设置一个内部的标记 update constarints...注意:layoutSubViews 在 drawRect 之前调用。...frame 写在同一方法中,写完约束就设置 frame,而不是想把 frame 的设置放到 layoutSubview 中,比如设置好约束后马上就想根据约束的结果计算高度,那么必须在设置完约束之后手动调用

69820
  • iOS layout相关方法

    setNeedsLayout 标记为需要重新布局,不立即刷新,但layoutSubviews一定会被调用配合layoutIfNeeded立即更新 layoutIfNeeded 如果有需要刷新的标记,立即调用...所以我们需要在动画中调用这个方法layoutIfNeeded所以代码应该这么写 leftContrain.constant = 100 UIView.animateWithDuration(0.8,...() //立即实现布局 }, completion: nil) 所以上面不管写多少约束的改变,只需要在动画里调用一次self.view.layoutIfNeeded(),所有的都会已动画的方式 。...drawRect调用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给...然后系统自动调用drawRect:方法。 3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置更改frame的时候自动调用drawRect:。

    1K10

    深入剖析Auto Layout,分析iOS各版本新增特性

    约束变化 触发约束变化包括 ActivatingDeactivating 设置constantpriority 添加和删除视图 这个Engine遇到约束变化会重新计算layout,获取新值后会call...调用了setNeedsLayout后不能通过frame改变视图和控件 为了让在设置了setTranslatesAutoresizingMaskIntoConstraints:NO视图里更改的frame立刻生效而执行了没有标记立刻刷新的...原因在于layoutIfNeeded需要有标记才会立刻调用layoutSubview得到宽高,不然是不会马上调用的。...页面第一次显示是会自动标记上需要刷新这个标记的,所以第一次看显示都是看不出问题的,但页面再次调用layoutIfNeeded时是不会立刻执行layoutSubview的(但之前加上setNeedsLayout...:NO时会严格按照约束->Engine->显示这种流程,如在Deferred Layout Pass之前设置好是没有问题的,之后强制执行LayoutSubview会产生一个权重和先前一样的约束在类似动画

    1.2K10

    关于Autolayout和Masonry自动布局的几个坑

    采用子控制器的原因是因为防止所有的逻辑代码都混在根控制器中,所以没有使用nicklockwood 的iCarousel SwipeView ,而是采用了之前一直在用的SCPageViewController...执行后会立刻调用layoutSubviews。 layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。...如果希望立刻生成新的frame需要调用此方法,利用这点一般布局动画可以在更新布局后直接使用这个方法让动画生效。...:重置之前约束 注意 先添加子视图,才能对子试图添加约束 如果想使用动画效果,需要如下代码: //重写updateViewConstraints方法,进行约束的更新- (void)updateViewConstraints...];}]; 经过测试,又找到一个方法,remake约束之后直接使用动画layoutIfNeeded 即可。

    1.7K20

    【iOS 开发】从 setNeedsLayout 说起

    为 UIView 提供了这些方法来进行视图的更新与重绘: public func setNeedsLayout() public func layoutSubviews() public func layoutIfNeeded...如上所述,在当前 run loop 结束之前,我们有机会做各种视图更改,并且这些更改会在下一个 run loop 体现出来,所以** View Drawing Cycle 就是一次次 run loop...基本上你不可能只在这个方法里只进行了单个 UIView 的布局修改,而是多项修改,那么 App 会在下一个 View Drawing Cycle 到来时,把这些修改一起执行,这是正常的情况。...code> 和 drawRect:) 但有些情况比较特殊:你打开 iOS 的时钟应用,去看里面的秒表页面,这个页面里面的两个按钮是没有 UIButton 默认的动画的,点击之后...---- setNeedsDisplay 补充 setNeedsLayout 的使用场景之前已经提过了(iPad App),下面举个栗子说一下 setNeedsDisplayInRect

    69710

    Swift-MVVM 简单演练(三)

    ,应该会看的更清楚 ---- 更改导航栏标题显示样式 之前微博的版本和现在多少有点区别,在首页的导航栏的标题位置仅仅是显示自己的昵称,并且可下拉展开。...这里不去做那么复杂,只是表达一下,更改导航栏标题显示样式和Button的文字图片左右对调,之前我也写过Objective-C的相关方法iOS-自定义 UIButton-文字在左、图片在右(一)、iOS-...工作原理: 当有一个运行循环启动,自动布局系统,会收集所有的约束变化 在运行循环结束前,调用layoutSubviews函数统一设置frame 如果希望某些约束提前更新!...使用layoutIfNeeded 函数让自动布局系统,提前更新当前收集到的约束变化 但是我们这里不是控制器,只是一个View,里面并没有viewDidAppear方法。我们就要找到一个类似的办法。...使用layoutIfNeeded 函数让自动布局系统,提前更新当前收集到的约束变化 因此,我们手动调用一下layoutIfNeeded方法,将代码布局的约束都创建好,并显示出来,然后再进行更新约束的动画

    2.5K30

    iOS屏幕适配概述1 屏幕适配简介2 Autoresizing3 Auto Layout

    iPhone横竖屏适配及iPhone和iPad开发时共用一个SB的问题" iOS 9 —— Size Classes + Auto Layout + StackView StackView 的核心便是方便垂直水平排布多个...secondItem.secondAttribute调换位置后注意multiplier和constant值的变化 3.2 通过代码修改constraints in AutoLayout 将constraints连线属性 调用属性...更改约束后,在block动画中调用layoutIfNeeded //修改constraints不代表直接改了frame,谁调用此方法,就会让自己及内部所有子控件立即根据constraints 更新 frame...[self. view layoutIfNeeded]; 3.3 代码中使用AutoLayout的注意点: 3.3.1 规则一 1.要先禁止Autoresizing功能,设置view的下面属性为NO...约束要作用的view.translatesAutoresizingMaskIntoConstraints = NO; 2.添加约束之前,一定要保证相关控件都已经在各自的父控件上 3.不用再给控件设置frame

    1.2K30

    iOS-UI控件之UITableView(三)- 自定义不等高的cell

    ; // 告诉tableView所有cell的估算高度 self.tableView.estimatedRowHeight = 44; 改变cell高度,只需要改变约束的值。...如果要支持iOS8之前 如果cell内部有自动换行的label,需要设置preferredMaxLayoutWidth属性 - (void)awakeFromNib { // 手动设置文字的最大宽度...} 设置tableView的cell估算高度 // 告诉tableView所有cell的估算高度(设置了估算高度,就可以减少tableView:heightForRowAtIndexPath:方法的调用次数...indexPath.row]; return cell.height; } - (CGFloat)height { // 强制布局cell内部的所有子控件(label根据文字多少计算出自己真实的尺寸...) [self layoutIfNeeded]; // 计算cell的高度 if (self.status.picture) { return CGRectGetMaxY

    871100

    关于Autolayout和Masonry自动布局的几个坑

    采用子控制器的原因是因为防止所有的逻辑代码都混在根控制器中,所以没有使用nicklockwood的iCarouselSwipeView,而是采用了之前一直在用的SCPageViewController...执行后会立刻调用layoutSubviews。 layoutIfNeeded:告知页面布局立刻更新。所以一般都会和setNeedsLayout一起使用。...:重置之前约束 注意 先添加子视图,才能对子试图添加约束 如果想使用动画效果,需要如下代码: //重写updateViewConstraints方法,进行约束的更新-(void)updateViewConstraints...执行动画效果, 设置动画时间[UIViewanimateWithDuration:0.2animations:^{[selflayoutIfNeeded];}]; 经过测试,又找到一个方法,remake约束之后直接使用动画...layoutIfNeeded即可。

    1.5K20

    swift手撕二维码一、简介二、二维码综合案例

    setValue(data, forKey: "inputMessage") 2.3 从二维码中获取结果 为了代码的健壮性,在操作之前先判断从滤镜中输出的图片是否为nil。...在扫描的时候,线是从最上方往最下方开始扫描,因此底部的约束开始的时候是停留在最上方。可以将背景View拖入代码中给底部约束做参考。进行重新约束之后添加动画。而且要求动画一直循环滚动。...2、二维码的扫描功能实现 输入仪器有很多种,比如说摄像仪器,话筒仪器,因此在扫描之前要先设置输入仪器为摄像仪器,将摄像仪器作为输入设备再识别图片,识别出来之后通过会话将源数据处理对象连接起来,接着启动会话...设置结果处理的代理 output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) 实现代理方法 //扫描到结果之后调用...startRunning() 2.5调用扫描方法 为了测试,设定在touchesBegan方法中调用扫描方法 override func touchesBegan(_ touches: Set<UITouch

    1.8K70

    iOS CornerRadius失效的解决方案

    iOS设置视图的cornerRadius属性失效的解决方案 1.1 解决步骤 1、尝试设置_numberLab.clipsToBounds = YES;2、尝试设置 [self.numberLab layoutIfNeeded...]; 之后再执行cornerRadius 在设置完约束后, 并不能马上得到它的frame, 只要添加[self.view layoutIfNeeded]; 就能拿到frame设置圆角了 - (void...)layoutSubviews{ [super layoutSubviews]; [self.numberLab layoutIfNeeded]; [self.contentView...,NO表示不裁剪,默认是NO;通常在通过设置layer.cornerRadius属性实现圆角效果时要设置masksToBounds为YES,以保证圆角效果的实现,但这种方法是一种很低效的实现方式,也是简单直接的...用法 - (void)layoutSubviews { [super layoutSubviews]; [self.titleV layoutIfNeeded]; [self.titleV

    72520

    iOS设置视图圆角失效的解决方案

    ]; 之后再执行cornerRadius 在设置完约束后, 并不能马上得到它的frame, 只要添加[self.view layoutIfNeeded]; 就能拿到frame设置圆角了 - (void...,NO表示不裁剪,默认是NO;通常在通过设置layer.cornerRadius属性实现圆角效果时要设置masksToBounds为YES,以保证圆角效果的实现,但这种方法是一种很低效的实现方式,也是简单直接的...3.1 减少cellForRowAtIndexPath代理中的计算量: ① 先要提前计算每个cell中需要的一些基本数据,代理调用的时候直接取出。...3.2 减少heightForRowAtIndexPath代理中的计算量: ① 由于每次tableView进行update(更新)都会对每一个cell调用heightForRowAtIndexPath代理取得最新的...② 如果高度不固定,那么应尽量将cell的高度数据计算好并储存起来,代理调用的时候直接取,即将height的计算时间复杂度降低到O(1)。

    2.3K10

    setNeedsDisplay看我就懂!

    为了允许用户更改颜色,我已经定义了UIStepper控件,我还添加一个按钮,这将导致要使用的步进值来调整CircleView的颜色值。...一般来说,使用框架控件,当您设置属性(如显示标签值)时,您将会使用该属性,这样会导致重新绘制控件,因为系统会实现对控件drawRect方法的调用。...根据上一篇文章setNeedsLayout和layoutIfNeeded看我就懂,所以我们在circleView.color = color之后添加了对setNeedsLayoutlayoutIfNeeded...的调用,但结果同样不会更新。...2、即使视图可能被移动或者有另一个视图重叠,也可能不需要重新绘制,因此您不能仅仅依靠已经移动整个视图添加另一个视图基于setNeedsLayoutupdateIfNeeded来导致重绘 3、当编写重载

    1.3K60
    领券