Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios iPhone旋转时CALayer的自动旋转_Ios_Cocoa Touch_Core Animation_Calayer - Fatal编程技术网

Ios iPhone旋转时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

我有一个UIViewController,我在其中向视图的层添加一个CALayer子类:

[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
    }

}