FacebookのSDKログインボタンに制約を追加しようとしています。
スクロールビュー内にボタンがあり、スクロールビュー内にあるラベルに上部の制約を追加しようとしています。実行時エラーなしで高さ制約を正常に追加できますが、実際の制約はボタンに適用されていないようです。
@IBOutlet weak var orLbl: UILabel!
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
var loginFBButton = FBSDKLoginButton()
loginFBButton.readPermissions = ["public_profile", "email"]
let heightConstraint = NSLayoutConstraint(
item: loginFBButton,
attribute: NSLayoutAttribute.Height,
relatedBy: NSLayoutRelation.Equal,
toItem: nil,
attribute: NSLayoutAttribute.NotAnAttribute,
multiplier: 1,
constant: 41)
let topConstraint = NSLayoutConstraint(
item: loginFBButton,
attribute: NSLayoutAttribute.TopMargin,
relatedBy: NSLayoutRelation.Equal,
toItem: self.orLbl,
attribute: NSLayoutAttribute.BottomMargin,
multiplier: 1,
constant: 31)
let leadingConstraint = NSLayoutConstraint(
item: loginFBButton,
attribute: NSLayoutAttribute.Leading,
relatedBy: NSLayoutRelation.Equal,
toItem: self.registerButton,
attribute: NSLayoutAttribute.Left,
multiplier: 1,
constant: 0)
let trailingConstraint = NSLayoutConstraint(
item: loginFBButton,
attribute: NSLayoutAttribute.Leading,
relatedBy: NSLayoutRelation.Equal,
toItem: self.registerButton,
attribute: NSLayoutAttribute.Right,
multiplier: 1,
constant: 0)
self.scrollView.addSubview(loginFBButton)
//loginFBButton.center = self.scrollView.center
loginFBButton.addConstraints([heightConstraint, topConstraint])
}
次に、最上位の制約の追加を含めると、ランタイムエラーが発生します。
ビューに追加する場合、制約のアイテムはそのビュー(またはビュー自体)の子孫である必要があります。ビュー階層をアセンブルする前に制約を解決する必要がある場合、これはクラッシュします。
キャッチされない例外 'NSGenericException'が原因でアプリを終了しています。理由: 'ビューに制約をインストールできません。制約はビューのサブツリーの外側から何かを参照していますか?それは違法です。
ラベルとFacebookボタンの両方がスクロールビューにありますか?orLbl.superviewとloginFBButton.superviewも印刷しましたが、両方のオプションのuiscrollviewを取得しています
新しい(iOS8、OS 10.10)、制約をアクティブ化する簡単な方法があります。これは、制約を追加するビューを特定する必要がありません。制約は、それらが属するビューをすでに認識しているため、最初にビューがsubViewとして追加されていることを確認してから、classメソッドactivateConstraints
を呼び出してNSLayoutConstraint
それらをアクティブにします。
NSLayoutConstraint.activateConstraints([heightConstraint, topConstraint])
プログラムでUI要素を作成するときは、フレームを制約にしないようにiOSに指示する必要があります。これを行うには、doを作成loginFBButton
した直後に:
Swift 1.2の場合:
loginFBButton.setTranslatesAutoresizingMaskIntoConstraints(false)
Swift 2.0および3.0の場合:
loginFBButton.translatesAutoresizingMaskIntoConstraints = false
最後に、より多くの制約が必要になります。幅の制約を設定しloginFBButton
、ボタンを水平に配置するための制約を追加することをお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加