ios - 如何在 Swift UIView 类中将 SubLayer 添加到图层

标签 ios swift uiview

我创建了一个 FirstView 类作为 UIView 类,并添加了一个容器来添加一些层,例如 salamLogo,以及 initializeViews() func 中的 addSub 层

import UIKit
import QuartzCore

class FirstView: UIView {
    var container: UIView {
        let x = CGFloat(0.0),
        y = CGFloat(0.0),
        w = CGFloat(screenWidth),
        h = CGFloat(screenHeight - statusBarHeight)
        let view = UIView(frame: CGRect(x: x, y: y, width: w, height: h))
        view.background(color: UIColor.red)
        return view
    }

    var salamLogo: CALayer {
        let layer = CALayer()
        let view = UIImage(named: "sibdiet_logo")?.cgImage
        let x = CGFloat(screenWidth / 2 - 72.0),
        y = CGFloat(20.0),
        w = CGFloat(160.0),
        h = CGFloat(160.0)
        layer.frame = CGRect(x: x, y: y, width: w, height: h)
        layer.contents = view
        layer.contentsGravity = kCAGravityResizeAspect
        return layer
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        initializeViews()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initializeViews()
    }
    private func initializeViews(){
        container.layer.addSublayer(salamLogo)
        addSubview(container)
    }

}

在 ViewController 中添加来自 FirstView 类的对象和 addSubView

import UIKit

var screenHeight: CGFloat =  UIScreen.main.bounds.height
let screenWidth: CGFloat =  UIScreen.main.bounds.width
let statusBarHeight = UIApplication.shared.statusBarFrame.height

class ViewController: UIViewController {

    var firstView:  FirstView!

    override func viewDidLoad() {
        super.viewDidLoad()

        screenHeight = screenHeight == 812 ? 788 : UIScreen.main.bounds.height

        firstView = FirstView(frame: CGRect(x: 0, y: statusBarHeight, width: screenWidth, height: screenHeight ))
        self.view.addSubview(firstView)

    }
}

在模拟器中显示红框但不显示salamLogo层,或任何层进入

最佳答案

添加图层与添加 subview 非常相似:

layer.addSublayer(salamLogo)

但在您的情况下,使用 subview 可能会更好?我在这里看不到使用图层的任何目的。您可以将 salamLogo 作为常规 UIImageView

====== 编辑 =====

回到您的解决方案。你的代码有问题。每次调用 containersalamLogo 时,都会创建新的 UIView 和新的 CALayer。要只保留一个实例,您应该这样做:

    lazy var container: UIView = {
        let x = CGFloat(0.0),
        y = CGFloat(0.0),
        w = CGFloat(screenWidth),
        h = CGFloat(screenHeight - statusBarHeight)
        let view = UIView(frame: CGRect(x: x, y: y, width: w, height: h))
        view.background(color: UIColor.red)
        return view
    }()

    lazy var salamLogo: CALayer = {
        let layer = CALayer()
        let view = UIImage(named: "sibdiet_logo")?.cgImage
        let x = CGFloat(screenWidth / 2 - 72.0),
        y = CGFloat(20.0),
        w = CGFloat(160.0),
        h = CGFloat(160.0)
        layer.frame = CGRect(x: x, y: y, width: w, height: h)
        layer.contents = view
        layer.contentsGravity = kCAGravityResizeAspect
        return layer
    }()

关于ios - 如何在 Swift UIView 类中将 SubLayer 添加到图层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46400752/

相关文章:

ios - 使用 NSPredicate 过滤年/月的 fetchRequest

javascript - SignInWithEmailAndPassword (Ionic/Vue/Firebase) 无法解决 iOS 中的 promise

swift - 以 AVCaptureVideoPreviewLayer 作为子层旋转 UIView

iphone - 如何取消touchesMoved :withEvent:

ios - objc_autoreleaseReturnValue 是什么意思?

ios - 触摸时在 UITableView 部分标题上显示选择突出显示

swift - 如何在 Swift 中正确初始化 UnsafePointer?

objective-c - 你如何将 Swift 结构/枚举合并到 Objective-C 中?

ios - 无法解析api响应

swift - 将 View 置于 UITableViewCell 的中心?看起来位于 UI 层次结构的中心,但不在实际的应用程序中?