2017-11-17 8 views
0

私はこのようなViewControllerを持っています。親のScrollViewにはUIView(wrapperView)があり、このラッパービューにはTextViewとImageViewがあります。 この単純な構造は、すべての制約が必要なインタフェースビルダーから作成され、正常に動作します。私はプログラム的権利ImageViewの(そこに緑色の矢印点)の下で私のwrapperViewの内側にもう一つのUIViewを追加する必要がありますいくつかのケースではプログラムによるサブビューとしてのUiViewの配置

enter image description here

だから私は、私は今、私はの上に画面上MYVIEWを参照してください

let myView = MyView.instanceFromNib() 
myView = CGRect(x: 0, y: 0, width: 300, height: 80) 
wrapperView.addSubview(myView) 

を追加し、それ

class MyView : UIView { 
    class func instanceFromNib() -> UIView { 
     return UINib(nibName: "MyView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView 
    } 
} 

そして、私のViewControllerのIコードのXIBの私の新しいUIViewのためのファイルと別のクラスを作成しましたラッパービューのような制約を適用しようとすると

NSLayoutConstraint(item: myView, attribute: .top, relatedBy: .equal, toItem: myImageView, attribute: .bottom, multiplier: 1.0, constant: 8).isActive = true 

同時に制約

を満たすことができない私が間違って何をしているのですか?

+1

'myView'の' translatesAutoresizingMaskIntoConstraints'を 'false'に設定しましたか? – Akki

+1

新しいビューを追加した後、 'UIScrollView'コンテンツサイズを更新する必要があります。 'layoutIfNeeded()'を呼び出してみてください。 – AaoIi

答えて

1

まず、この設定する必要があります。

myView.translatesAutoresizingMaskIntoConstraints = false 

をそして、あなたは競合している何の独自の制約がないことを確認する必要があります。ストーリーボードでは、おそらくimageView.bottomAnchorwrapperView.bottomAnchorにバインドする制約を追加しました。これらの2つのアンカーの間に別のビューを置くと、その制約を無効にする必要があります。 、

  1. imageView.bottomAnchorwrapperView.bottomAnchorから10ポイントであることを言って制約がある

を想像しますがあります - あなたがそこにmyViewを絞るしようとした場合

それ以外の場合は、制約競合をもたらすことができます

  1. imageView.bottomAnchorという2つの制約は、01から10ポイントにする必要がありますとmyView.bottomAnchorは、wrapperView.bottomAnchorから10ポイントにする必要があります。

明らかに、これらのシナリオの両方を満たすことはできません。

-1

あなたは、満足できない制約を含むUIの問題をデバッグするために、デバッグビュー階層を使用することができます。ほとんどの場合、実行時に追加される.top制約は、ストーリーボードに設定した.top制約と競合しています。

0

私は、最も簡単な解決策は、UIStackViewを高さのないインターフェースビルダーのwrapperViewに追加し、必要な制約(上、左、下、右)を追加することだと思います。次に、あなたのViewControllerにUIStackViewのIBOutletをドラッグすると、あなたはサブビューを追加する必要がありますとき:

@IBOutlet weak var stackView: UIStackView! 

func someFunc() { 
    let myView = MyView.instanceFromNib() 
    myView = CGRect(x: 0, y: 0, width: 300, height: 80) 
    stackView.addArrangedSubview(myView) 
} 

UIStackViewは、サブビューに基づいて、そのサイズを変更します。

関連する問題