2017-01-16 248 views
0

正确显示我有以下代码:FB登录按钮不在视野

override func viewDidLoad() { 
    super.viewDidLoad() 

    let fbLoginButton = FBSDKLoginButton() 
    fbLoginView.contentMode = UIViewContentMode.scaleAspectFit 
    fbLoginView.addSubview(fbLoginButton) 
    fbLoginButton.frame.origin = fbLoginView.frame.origin 

    fbLoginButton.frame = CGRect(x: fbLoginView.frame.origin.x, y: fbLoginView.frame.origin.y, width: fbLoginView.frame.width, height: fbLoginView.frame.height) 

    print("INFO width: \(fbLoginView.frame.width) height: \(fbLoginView.frame.height)") 
    print("INFO width: \(fbLoginButton.frame.width) height: \(fbLoginButton.frame.height)") 
    // fbLoginButton.delegate = self 
} 

我想一个小的子视图,我在我的主视图中添加Facebook登录按钮。出于某种原因,当我打印出来的UIView的宽度/高度,以及Facebook登录按钮,我看到这一点:

INFO宽度:1000.0高度:1000.0 INFO宽度:1000.0高度:1000.0

但是当我运行。在模拟器上我看到视图心不是1000.0 X 1000.0(它会溢满了屏幕,但它是不是应用它看起来像这样:

enter image description here

您可以SE的蓝色按钮,并且它正确的在较小的子视图内,但是,按钮实际上似乎是溢出大于视图。我不明白为什么视图在模拟器中的尺寸是正确的,但它说它的尺寸非常大。我读过这里的帖子,告诉我调整按钮的方向适合度,我已经玩过所有其他选项,但没有运气。

我有较小的UIView设置是这样的: enter image description here

+0

是否使用自动版式? – Yannick

+0

是的,我在uiView @Yannick – mufc

回答

2

viewDidLoad,应用程序还没有完成它的自动布局经过这么多的意见是1000x1000点。

因此,在您的代码中,当您将loginButton的尺寸设置为与loginView的尺寸相匹配时,它将复制1000的值。

稍后,当您的应用应用其自动布局约束时,包含loginView的尺寸将调整为正确的尺寸,但在其内部,loginButton的尺寸会更大。

正确的解决办法是使用自动版式正确约束loginButton - 最简单的变化将是内loginView添加约束它,因此它在同一时间调整:

NSLayoutConstraint(item: fbLoginButton, attribute: .Trailing, relatedBy: .Equal, toItem: fbLoginView, attribute: .Trailing, multiplier: 1.0, constant: 0.0).active = true 
NSLayoutConstraint(item: fbLoginButton, attribute: .Leading, relatedBy: .Equal, toItem: fbLoginView, attribute: .Leading, multiplier: 1.0, constant: 0.0).active = true 
NSLayoutConstraint(item: fbLoginButton, attribute: .Top, relatedBy: .Equal, toItem: fbLoginView, attribute: .Top, multiplier: 1.0, constant: 0.0).active = true 
NSLayoutConstraint(item: fbLoginButton, attribute: .Bottom, relatedBy: .Equal, toItem: fbLoginView, attribute: .Bottom, multiplier: 1.0, constant: 0.0).active = true 

或者它很可能是清洁剂添加您的故事板内Facebook的按钮直接(添加一个空的视图和它的类设置为FBSDKLoginButton)。

+0

的尾部和前端都有一个约束43谢谢你的解决方案。我没有意识到在viewDidLoad之后设置了自动布局约束。我最终只是将views类设置为FBSDKLoginButton,因为它更简单,并且完全符合我的需求。再次感谢! – mufc

+1

没问题。 明确地说,约束条件是在'viewDidLoad'处设置的,但是它们不会被转换成一个'frame',直到这个过程的晚些时候。正如Yannick指出的那样,如果您需要在计算框架后调查某些子视图的大小,您应该重写'viewDidLayoutSubview'。 – Estel

+0

很好的解释,为什么它不工作! – Yannick

0

在viewDidLoad中的帧的问题()是它们不layouted。他们还没有他们的最终尺寸。你可以使用viewDidLayoutSubviews()。

我会建议使用NSLayoutConstraints,虽然。看看你想要用你的框架做什么,你可以简单地创建约束条件并将它们添加到你的视图中。

let topConstraint = NSLayoutConstraint(item: fbLoginButton, attribute: .top, relatedBy: .equal, toItem: fbLoginView, attribute: .top, multiplier: 1, constant: 0) 
let bottomConstraint = NSLayoutConstraint(item: fbLoginButton, attribute: .bottom, relatedBy: .equal, toItem: fbLoginView, attribute: .bottom, multiplier: 1, constant: 0) 
let leadingConstraint = NSLayoutConstraint(item: fbLoginButton, attribute: .leading, relatedBy: .equal, toItem: fbLoginView, attribute: .leading, multiplier: 1, constant: 0) 
let trailingConstraint = NSLayoutConstraint(item: fbLoginButton, attribute: .trailing, relatedBy: .equal, toItem: fbLoginView, attribute: .trailing, multiplier: 1, constant: 0) 

self.view.addConstraints([topConstraint, bottomConstraint, leadingConstraint, trailingConstraint])