我正在尝试获取我的CAGradientLayers,我正在使用它创建漂亮的渐变背景,在旋转和模态视图演示时很好地调整大小,但它们不会播放球 .
这是我刚创建的一个视频,显示了我的问题:请注意旋转时撕裂 .
另请注意,此视频是通过在OS X上拍摄iPhone模拟器而创建的 . 我放慢了视频中的动画以突出显示我的问题 .
这是我刚刚创建的Xcode项目(这是视频中显示的应用程序的源代码),基本上如图所示,旋转时出现问题,尤其是当模式呈现视图时:
Xcode Project, modally presenting views with CAGradientLayer backgrounds...
我理解使用以下内容是值得的:
[[self view] setBackgroundColor:[UIColor blackColor]];
做一个合理的工作,使转换更加无缝,不那么刺耳,但如果你看我的视频,虽然目前处于横向模式,模态呈现一个视图,你会明白为什么上面的代码无济于事 .
我有什么想法可以解决这个问题吗?
约翰
8 回答
信息
用作一线解决方案
再次将梯度添加到视图中时替换渐变(在可重用中使用)
自动转换
自动删除
详情
Swift 3.1,xCode 8.3.3
解决方案
用法
使用StoryBoard
以编程方式
当您创建图层(如渐变图层)时,会出现's no view managing the layer (even when you add it as a sublayer of some view' s图层) . 像这样的独立层不参与
UIView
动画系统 .因此,当您更新渐变图层的帧时,该图层会使用其自己的默认动画参数设置动画 . (这称为“隐式动画” . )这些默认参数与用于界面旋转的动画参数不匹配,因此您得到一个奇怪的结果 .
我没有看你的项目,但用这段代码重现你的问题是微不足道的:
这是看起来像,在模拟器中启用慢动作:
幸运的是,这是一个很容易解决的问题 . 您需要使渐变图层由视图管理 . 您可以通过创建使用
CAGradientLayer
作为其图层的UIView
子类来实现 . 代码很小:然后,您需要更改代码以使用
GradientView
而不是CAGradientLayer
. 由于你以后必须做任何事情才能处理轮换:这是结果:
@ rob的答案最好的部分是视图控制着你的层 . 这是Swift代码,它正确地覆盖了图层类并设置了渐变 .
然后,您可以在任意位置添加两行视图 .
我的快速版本:
请注意,我还必须使用设备比例来计算帧大小 - 在方向更改期间获得正确的自动调整大小(使用自动布局) .
在Interface Builder中,我添加了一个UIView并将其类更改为GradientView(上面显示的类) .
然后我为它创建了一个插座(myGradientView) .
最后,在视图控制器中我添加了:
请注意,渐变视图是在“layoutSubviews”方法中创建的,因为我们需要一个最终的框架来创建渐变图层 .
插入这段代码并删除
willAnimateRotationToInterfaceOrientation:duration:
实现时,它看起来会更好 .然而,这不是很优雅 . 在实际应用程序中,您应该将UIView子类化以创建渐变视图 . 在此自定义视图中,您可以覆盖layerClass,以便它由渐变层支持:
同时实现
layoutSubviews
来处理视图边界的变化 .创建此背景视图时,请使用自动调整蒙版,以便边界在界面旋转时自动调整 .
完整的Swift版本 . 在
viewDidLayoutSubviews
中拥有此视图的viewController中设置viewFrame
另一个快速版本 - 没有使用drawRect .
在控制器中我只是打电话:
就个人而言,我更喜欢将所有内容保持在视图子类中 .
这是我的Swift实现: