【发布时间】:2018-06-04 12:59:24
【问题描述】:
如果我创建一个带有类似 UIView(frame:..) AND 的框架的 UIView 也在此视图上设置约束,框架尺寸是否会优先于约束? iOS 运行时会忽略约束吗?
我在viewDidLoad() 中创建了一个带有框架的 UIView,并将约束附加到该视图。然而,约束并没有被强制执行,视图在传递给初始化程序的框架中呈现。
[编辑]
我的代码如下。我正在尝试在覆盖整个屏幕的 UIView(previewContainer,配置了情节提要上的约束)之上以编程方式将覆盖添加到 AVCaptureVideoPreviewLayer(viewPreviewLayer)。
....
var videoPreviewLayer:AVCaptureVideoPreviewLayer!
@IBOutlet weak var previewContainer: UIView!
....
override func viewDidLoad() {
.....
self.configurePreviewLayer()
}
override func viewDidLayoutSubviews() {
print("viewDidLayoutSubviews")
super.viewDidLayoutSubviews()
self.videoPreviewLayer.frame = self.previewContainer.bounds
}
func configurePreviewLayer() {
print("configurePreviewLayer()")
self.videoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
self.videoPreviewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
self.previewContainer.layer.addSublayer(self.videoPreviewLayer)
configureBlurView()
}
func configureBlurView() {
print("configureBlurView()")
// Blur View
let viewFinderRadius:CGFloat = self.view.bounds.width / 2.0 - 16.0
print("configureBlurView:\(self.previewContainer.bounds.size.height)")
let blurView = createOverlay(frame:self.previewContainer.bounds,xOffset: self.view.bounds.size.width / 2.0, yOffset: self.view.bounds.size.height / 2.0, radius: viewFinderRadius)
blurView.translatesAutoresizingMaskIntoConstraints = false
self.previewContainer.addSubview(blurView)
self.blurView = blurView
blurView.leftAnchor.constraint(equalTo: self.previewContainer.leftAnchor).isActive = true
blurView.topAnchor.constraint(equalTo:self.previewContainer.topAnchor).isActive = true
blurView.rightAnchor.constraint(equalTo:self.previewContainer.rightAnchor).isActive = true
blurView.bottomAnchor.constraint(equalTo:self.previewContainer.bottomAnchor).isActive = true
}
func createOverlay(frame : CGRect, xOffset: CGFloat, yOffset: CGFloat, radius: CGFloat) -> UIView
{
let overlayView = UIView(frame: frame)
overlayView.backgroundColor = UIColor.black.withAlphaComponent(0.7)
let path = CGMutablePath()
path.addArc(center: CGPoint(x: xOffset, y: yOffset), radius: radius, startAngle: 0.0, endAngle: 2.0 * CGFloat.pi, clockwise: false)
path.addRect(CGRect(origin: .zero, size: overlayView.frame.size))
let maskLayer = CAShapeLayer()
maskLayer.backgroundColor = UIColor.black.cgColor
maskLayer.path = path
maskLayer.fillRule = kCAFillRuleEvenOdd
overlayView.layer.mask = maskLayer
overlayView.clipsToBounds = true
return overlayView
}
这是渲染屏幕的外观(如您所见,覆盖并没有覆盖整个屏幕,或者换句话说,previewContainer 的整个边界)-
[更新]
我可能找到了罪魁祸首。正是这段代码掩盖了覆盖 -
let path = CGMutablePath()
path.addArc(center: CGPoint(x: xOffset, y: yOffset), radius: radius, startAngle: 0.0, endAngle: 2.0 * CGFloat.pi, clockwise: false)
path.addRect(CGRect(origin: .zero, size: overlayView.frame.size))
let maskLayer = CAShapeLayer()
maskLayer.backgroundColor = UIColor.black.cgColor
maskLayer.path = path
maskLayer.fillRule = kCAFillRuleEvenOdd
overlayView.layer.mask = maskLayer
如果我删除上面的掩码,一切都会正确呈现。现在我需要弄清楚如何绘制那个蒙版(相机的取景器)。
【问题讨论】:
-
显示。您的。代码。
-
@matt 请参见上文。我用代码和屏幕截图更新了我的帖子。
标签: ios iphone uiview autolayout ios-autolayout