【问题标题】:calling setFrame multiple times?多次调用 setFrame?
【发布时间】:2015-12-03 09:24:00
【问题描述】:

我为同一个视图多次调用 setFrames。

例如在设置 ltr 视图框架后,我检查布局是否应该是 rtl 并再次更改视图框架。

-(void)setViewsFrames:(BOOL)RTL{
      view1.frame = CGRECMAKE();
      view2.frame = CGRECMAKE();
      view3.frame = CGRECMAKE();
         .
         .
         .
      if(RTL){
         [view1 setRtlFrame];
         [view2 setRtlFrame];
         [view3 setRtlFrame];
            .
            .
            .


      }

}


-(void)setRtlFrame{
    CGRect RTLFrame = self.frame;
    RTLFrame.origin.x = [self superview].frame.size.width - self.frame.origin.x - self.frame.size.width;
    [self setFrame:RTLFrame];
}

多次调用 setFrames 是否会强制系统多次绘制视图?并且可能会影响性能。

我也在 UICollectionViewCell 中使用它,所以每次她想绘制单元格时系统都会调用setViewsFrames:

编辑: 我做了一个小测试。我检查何​​时调用drawRect,结果如下:

  • 无论 setFrame 被调用多少次,它只会被调用一次。

  • 在 UICollectionCellView 中,它仅在单元格创建或重新加载时调用。

【问题讨论】:

  • drawRect 中添加断点并检查自己。
  • @dasdom 谢谢你的回复,但是如何给drawRect添加断点,我无法打开UIVIew.m文件。
  • 您可以创建一个视图并使用它。只是为了验证发生了什么。然后您可以切换回使用UIView 实例。
  • @dasdom 谢谢,我会做的。
  • @dasdom drawRect 只会被调用一次,不管 setFrame 被调用了多少次。即使在滚动单元格时,UICollectionCellView drawRect 也只调用一次,因此仅在创建单元格时调用绘制矩形。很奇怪是吗?

标签: ios performance uiview frame cgrect


【解决方案1】:

设置框架调用“setNeedsLayout”,然后在下一次运行循环迭代中,IOS 知道布局和重绘视图。

布局/重绘用户看不到的东西是没有意义的,所以 iOS 会为你合并调用——如果你允许它使用 setNeedsXY 方法

所以设置框架的开销通常是最小的

(除非您处理自定义(实施不良)视图[您不处理;)])

【讨论】:

  • 感谢您的回答,但是 setNeedsXY 方法是什么?您对实施不良的视图是什么意思?为什么在滚动 uicollectionViewcell 时不调用 drawRect ,因为在滚动 ios 时需要再次绘制单元格,对吗?再次感谢
  • 1. setNeedsXY 是 setNeedsDisplay 和 setNeedsLayout - 但理论上这个概念可以转移到其他用例
  • 2.糟糕的实现:调用 [self layoutSubviews] 或 [self display] 而不是使用 setNeedsXY 方法来延迟/合并这些操作的视图
  • 3.视图的图层被缓存,只要它的边界不改变,就不必重绘。如果您需要调用 setNeedsDisplay 但只是因为滚动而重绘?!这会破坏滚动性能
  • BOUNDS.. 与原产地无关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 2018-10-19
  • 2013-03-31
相关资源
最近更新 更多