Ios iPhone旋转时CALayer的自动旋转
我有一个UIViewController,我在其中向视图的层添加一个CALayer子类:Ios iPhone旋转时CALayer的自动旋转,ios,cocoa-touch,core-animation,calayer,Ios,Cocoa Touch,Core Animation,Calayer,我有一个UIViewController,我在其中向视图的层添加一个CALayer子类: [self.view.layer addSublayer:myObject.backgroundLayer]; 旋转设备时,视图会旋转,但CALayer不会旋转。它被分流到左边,仍然在纵向视图中 有没有办法使子层自动旋转,或者我需要应用变换?您需要自己管理CALayer的旋转。我相信0,0保持在同一位置,并且大小会更改以匹配新方向,因此如果您想自己做一些事情,您需要自己管理旋转变换的添加。使用Swift
[self.view.layer addSublayer:myObject.backgroundLayer];
旋转设备时,视图会旋转,但CALayer不会旋转。它被分流到左边,仍然在纵向视图中
有没有办法使子层自动旋转,或者我需要应用变换?您需要自己管理CALayer的旋转。我相信0,0保持在同一位置,并且大小会更改以匹配新方向,因此如果您想自己做一些事情,您需要自己管理旋转变换的添加。使用Swift 4/iOS 11,根据您的需要,您可以选择以下6个示例中的一个,以便在设备旋转时管理
CALayer
/CAGradientLayer
帧
下面的示例使用CAGradientLayer
,但可以轻松映射到CALayer
或CAShapeLayer
案例
#1.重写
UIViewController
viewDidLayoutSubviews()
#2.重写
UIViewController
loadView()
,子类化UIView
并重写UIView
LayoutSubView()
斯威夫特
LayerView.swift(备选方案)
ViewController.swift
#3.使用键值观察(KVO) ViewController.swift
#5.重写
UIViewController
loadView()
,子类化UIView
并重写CALayerDelegate
布局子层(共:)
斯威夫特
ViewController.swift
#6.覆盖
UIViewController
loadView()
,子类化UIView
,覆盖UIView
layerClass
,子类化CALayer
和覆盖CALayer
layoutSublayers()
斯威夫特
斯威夫特
ViewController.swift
资料来源:
import UIKit
class ViewController: UIViewController {
let gradientLayer: CAGradientLayer = {
let layer = CAGradientLayer()
layer.colors = [
UIColor.blue.cgColor,
UIColor.cyan.cgColor
]
return layer
}()
override func viewDidLoad() {
super.viewDidLoad()
view.layer.addSublayer(gradientLayer)
gradientLayer.frame = view.bounds
}
override func viewDidLayoutSubviews() {
gradientLayer.frame = view.bounds
}
}
import UIKit
class LayerView: UIView {
lazy var gradientLayer: CAGradientLayer = {
let layer = CAGradientLayer()
layer.colors = [
UIColor.blue.cgColor,
UIColor.cyan.cgColor
]
self.layer.addSublayer(layer)
return layer
}()
override func layoutSubviews() {
gradientLayer.frame = bounds
}
}
import UIKit
class LayerView: UIView {
var gradientLayer: CAGradientLayer!
override func layoutSubviews() {
if gradientLayer == nil {
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [
UIColor.blue.cgColor,
UIColor.cyan.cgColor
]
self.gradientLayer = gradientLayer
layer.addSublayer(gradientLayer)
}
gradientLayer.frame = bounds
}
}
import UIKit
class ViewController: UIViewController {
let layerView = LayerView()
override func loadView() {
view = layerView
}
}
import UIKit
class ViewController: UIViewController {
var observation: NSKeyValueObservation?
let gradientLayer: CAGradientLayer = {
let layer = CAGradientLayer()
layer.colors = [
UIColor.blue.cgColor,
UIColor.cyan.cgColor
]
return layer
}()
override func viewDidLoad() {
super.viewDidLoad()
view.layer.addSublayer(gradientLayer)
observation = view.observe(\.frame, options: [.new], changeHandler: { [unowned self] (object: UIView, change: NSKeyValueObservedChange<CGRect>) in
guard let frame = change.newValue else { return }
self.gradientLayer.frame = frame
})
// Also works
/*
observation = observe(\.view.frame, options: [.new], changeHandler: { [unowned self] (object: ViewController, change: NSKeyValueObservedChange<CGRect>) in
guard let frame = change.newValue else { return }
self.gradientLayer.frame = frame
})
*/
}
}
import UIKit
class LayerView: UIView {
override public class var layerClass: AnyClass {
return CAGradientLayer.self
}
required init() {
super.init(frame: .zero)
guard let gradientLayer = layer as? CAGradientLayer else { return }
gradientLayer.colors = [
UIColor.blue.cgColor,
UIColor.cyan.cgColor
]
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
import UIKit
class ViewController: UIViewController {
let layerView = LayerView()
override func loadView() {
view = layerView
}
}
import UIKit
class LayerView: UIView {
required init() {
super.init(frame: .zero)
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [
UIColor.blue.cgColor,
UIColor.cyan.cgColor
]
layer.addSublayer(gradientLayer)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSublayers(of layer: CALayer) {
layer.sublayers?.forEach {
$0.frame = layer.bounds
}
}
}
import UIKit
class ViewController: UIViewController {
let layerView = LayerView()
override func loadView() {
view = layerView
}
}
import UIKit
class Layer: CALayer {
override init() {
super.init()
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [
UIColor.blue.cgColor,
UIColor.cyan.cgColor
]
addSublayer(gradientLayer)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSublayers() {
sublayers?.forEach {
$0.frame = bounds
}
}
}
import UIKit
class LayerView: UIView {
override public class var layerClass: AnyClass {
return Layer.self
}
}
import UIKit
class ViewController: UIViewController {
let layerView = LayerView()
override func loadView() {
view = layerView
}
}