【问题标题】:CALayer auto resizing in iOS on device orientation changeCALayer 在 iOS 中根据设备方向更改自动调整大小
【发布时间】:2014-04-13 02:38:54
【问题描述】:

我又加了一个自定义视图的CALayer,代码是

hostedGraphLayer.frame = self.layer.bounds;
[self.layer addSublayer:hostedGraphLayer];

当设备方向改变时,视图层的子层也会旋转,但它不会相对于视图自动调整大小。图层不会有 iOS 的 autoresize 属性。

stackOverFlow 中已有的答案之一是CALayers didn't get resized on its UIView's bounds change. Why? 在这种情况下,在设备方向更改时设置层的框架,层不会在旋转开始和结束之间根据其视图自动调整大小,这可以通过慢速切换在模拟器中清楚地看到动画。

对于这个“当视图被旋转时,它的图层也会被旋转并且它应该根据它的视图调整大小”有什么解决方法吗?

【问题讨论】:

    标签: ios objective-c calayer


    【解决方案1】:

    不,还没有内置修复程序,

    你必须改变它的框架。

    如果我错了,请纠正我。

    【讨论】:

      【解决方案2】:

      在视图属性检查器中,将视图模式设置为重绘。

      内容将不再适应或对齐甚至拉伸,而是将沿着动画呈现。

      真正发生的是它渲染到最终位置,并且渲染在动画期间被拉伸,但这是一个对用户几乎不可见的技巧:)

      上面的技巧将在视图的框架更改时在背景层 (view.layer) 上调用 setNeedsDisplay但由您来更新其子级setNeedsDisplay一个层不会传播到子层。
      这些子层也不会像视图那样自动调整大小。
      如果您真的想要这种行为,请改用视图,或者通过覆盖父层的setNeedsDisplay方法来强制重绘自己。

      -(void)setNeedsDisplay
      {
          [super setNeedsDisplay];
          for (CALayer *sublayer in self.sublayers) {
              [sublayer setNeedsDisplay];
          }
      }
      

      这完全取决于您需要重绘什么/如何重绘。

      如果您真的想使用一个图层作为与您的视图框架匹配的背景图层,请将 UIView 子类化并覆盖其类方法+(Class)layerClass 以返回您的图层类。

      +(Class)layerClass
      {
          return [MyCustomLayer class];
      }
      

      它将使用您的自定义图层作为默认背景图层
      它非常强大;)我在任何地方都使用它
      不要忘记Redraw 属性!

      【讨论】:

      • 它更多地取决于给定的 autoresizeMask 在分配此视图后立即赋予所需的子视图对象,并在其父视图中使用图层。您可以通过在子视图类中实现 -(void)layoutSubview: 来强制布局。
      • 我先学会了复杂的方法……layoutSubview 效果很好。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多