поэтому я использовал файл xib и поместил представление изображения в этот файл xib, я поместил представление (перспективаView) и поместил представление изображения в это представление, и я хочу воспроизвести вид перспективы, поэтому вот мои коды в файле UIView, который является классом файла xib
import UIKit
class perspectiveView: UIView {
@IBOutlet var contentView: UIView!
@IBOutlet weak var perspectiveTitle: UILabel!
@IBOutlet weak var perspectiveView: UIView!
@IBOutlet weak var perspectiveImage: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
override func layoutSubviews() {
super.layoutSubviews()
let replicatorLayer = CAReplicatorLayer()
let coloredSquare = CALayer()
// coloredSquare.backgroundColor = UIColor.red.cgColor
coloredSquare.frame = perspectiveView.bounds
coloredSquare.contents = perspectiveView.asImage().cgImage
let instanceCount = 3
replicatorLayer.instanceCount = instanceCount
replicatorLayer.instanceTransform = CATransform3DMakeTranslation(5, -10, -1)
replicatorLayer.instanceAlphaOffset = -0.3
replicatorLayer.addSublayer(coloredSquare)
perspectiveView.layer.addSublayer(replicatorLayer)
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
Bundle.main.loadNibNamed("perspectiveView", owner: self, options: nil)
addSubview(contentView)
contentView.frame = self.bounds
contentView.autoresizingMask = [.flexibleHeight , .flexibleWidth]
}
}
extension UIView {
// Using a function since `var image` might conflict with an existing variable
// (like on `UIImageView`)
func asImage() -> UIImage {
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
}
}
так что это сработает, но не так, как я ожидал
Я думаю, вам следует удалить эту строчку Bundle.main.loadNibNamed("perspectiveView", owner: self, options: nil)
из perspectiveView
. Вместо этого установите perspectiveView
как имя пользовательского класса в файле Xib
. Затем используйте эту строку Bundle.main.loadNibNamed
для загрузки этого представления везде, где вы хотите его использовать, но не внутри того же class
.
пожалуйста, проверьте обновленные коды, это будет работать, но не так, как я ожидал
ничего не получится просто получить это в журнале (lldb), при использовании этого кода репликатор не будет работать, а при использовании replicator.addSublayer (перспективаView.layer) произойдет сбой