2016-07-10 5 views
1

UIViewControllerUIScrollViewが含まれており、UIImageView.が含まれています。UIButtonをプログラムで作成しました(プロジェクトにはストーリーボード/ nibが含まれていません)。プログラムでUIButtonの制約を作成する

ボタンを画面の右上隅に固定したままにしたいのですが、手動で適切な制約を作成する方法がわかりません。

私は次のように動作すると考えましたが、ボタンはまだ正しく配置されていません。 viewWillLayoutSubviews()でも何かする必要がありますか?

// Setup constraints, in viewDidLoad() 
let viewDict = ["shareButton": self.shareButton!] 
self.scrollView.addConstraints(NSLayoutConstraint.constraints(
          withVisualFormat: "H:[shareButton]|", 
             options: [], 
             metrics: nil, 
             views: viewDict)) 

self.scrollView.addConstraints(NSLayoutConstraint.constraints(
          withVisualFormat: "V:|[shareButton]", 
             options: [], 
             metrics: nil, 
             views: viewDict)) 
+0

'V:| [shareButton]'はタイプミスですか?それは 'V:| [shareButton] |'であると考えられます。 – tktsubota

+0

そのコードの結果はどうなりますか?どこにボタンがありますか?ボタンは、ViewControllerのビューまたはscrollViewのサブビューですか? – ddb

答えて

0

あなたがコードですべてをやっている場合は、これら2つの制約が完全にあなたのUIIMageViewの配置を指定するのに十分ではないが、これら2つの制約に少なくとも幅と重量を追加する(例:あなたはすでにでていた制約を変更H:[shareButton(100)]|)。

また、私は自動レイアウトマスクの翻訳をshareButton.translatesAutoresizingMaskIntoConstraints = falseの制約に無効にすることをお勧めします。

このレイアウトでは、viewWillLayoutSubviewsに何もする必要はありません。

0

あなたのクラスの最後

extension UIView { 


    func addCosntraintsWithFormat(format: String, views: UIView...) { 

     var viewsDictionary = [String: UIView]() 

     for (index, view) in views.enumerate() { 
      let key = "v\(index)" 
      viewsDictionary[key] = view 
     } 

     addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) 
    } 
} 

でこの拡張機能を追加することができ、その後、あなたはこの

self.scrollView.addConstraintsWithFormat("H:[v0(\(YourWidthConstant))]|", views: shareButton) 
self.scrollView.addConstraintsWithFormat("V:|[v0(\(YourHeightConstant))]", views: shareButton) 

、あなたはこれを達成することはできませんsource of this information is this

+0

私が追加したソースに35分で関連コンテンツが含まれています –

1

のような制約を追加することができますスクロールビューがアプリのトップレベルのビューである場合はレイアウトスクロール・ビューとスクロール・ビューの子孫との間の制約は、スクロール・ビューのスクロール・コンテンツ内のデカンドントを常に制約します。詳細はTechnical Note TN2154 UIScrollView And Autolayoutを参照してください。あなたは、スクロールビューのサブビューを作ることができます

注ビューと外部のビュー間の制約を作成することにより、他のスクロールコンテンツ上に(スクロールしない)浮いているように見える:テクニカルノートは、あなたが何をする必要があるかを正確に説明しますスクロールビューのサブビュー(スクロールビューのスーパービューなど)次に、(これらの配置のいずれかで)ルートにボタンを制約することができます

+-- UIView (view controller's root view) 
    | 
    +-- UIScrollView 
    | | 
    | +-- UIImageView 
    | 
    +-- UIButton 

+-- UIView (view controller's root view) 
    | 
    +-- UIScrollView 
     | 
     +-- UIImageView 
     | 
     +-- UIButton 

またはこのような:あなたはこのようなあなたのビュー階層を配置する必要がある

次のように表示されます:

NSLayoutConstraint.activateConstraints([ 
    shareButton.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor, constant:-8), 
    shareButton.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 8) 
]) 
+1

ありがとうございました。これは私の 'viewDidLoad()'の[要約版](https://gist.github.com/rmangino/ea99a98d85cbfa1e1eff9d02034cfca8)です。他の制約は追加していません。あなたはその問題を見ていますか? TIA – RobertJoseph

+1

'shareButtonを設定する必要があります。translatesAutoresizingMaskIntoConstraints = false'となります。 –

関連する問題