2017-12-21 20 views
-5

-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の境界全体画面全体を覆ったり、他の言葉ではありません見ることができるように)である -

enter image description here

[更新]

私は犯人を発見したことがあります。オーバーレイをマスクするのはこのコードです -

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 

上記のマスクをすべて削除すると、すべてが正しくレンダリングされます。今度は、そのマスクを描く方法を理解する必要があります(カメラのビューファインダー)。

+3

を表示します。きみの。コード。 – matt

+0

@matt上記を参照してください。私はコードとスクリーンショットで自分の投稿を更新しました。 – cubsnlinux

答えて

0

iOSランタイムは制約を無視しますか?

制約が正しく設定されている場合は、いいえ:frameは無視されます。しかし、あなたはあなたがしたことを示していないので、あなたが見ているものとその理由を言うことは不可能です。

+0

上記を参照してください。私はコードとスクリーンショットで自分の投稿を更新しました。 – cubsnlinux

+0

あなたの問題は、質問が示すように思われるよりはるかに複雑です。基本的にx-y質問をしました(実際の問​​題について質問するのではなく、問題が何であるかを質問してください) – matt

+0

そのように見えます。私が作ろうとしているものになるために何が間違っているのか教えてください。あなたが見ることができるように、私はカメラビュー上にオーバーレイを作成したいと思います。私はまた、最終的にオーバーレイの上にラベルなどを添付したいと思います。 – cubsnlinux

関連する問題