-UIView(frame:..)
とのようなフレームでUIViewを作成すると、このビューに制約を設定すると、フレームのサイズが制約よりも優先されますか? iOSランタイムは制約を無視しますか?プログラムでUIViewを作成する
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
@matt上記を参照してください。私はコードとスクリーンショットで自分の投稿を更新しました。 – cubsnlinux