将故事板约束转换为代码

时间:2014-11-29 05:58:15

标签: swift ios8 autolayout constraints xcode6.1

我尝试以编程方式为我的应用中的类设置约束,以便在键盘出现时一切都向上移动。我之前已经在故事板中使用了它,但是当我在尺寸检查器中使用它所说的内容并以代码格式编写时,它并没有按预期工作。

...
//memo area
var memoArea = UITextView(frame: CGRectMake(20, 291, 275, 225))
memoArea.backgroundColor = majorColor
memoArea.delegate = self
self.view.addSubview(memoArea)

var memoLine = customShadow(theself: self.view, frame: memoArea.frame)

//Spacer View
var spacer:UIView = UIView(frame: CGRectMake(84, 518, 160, 6))
spacer.alpha = 0
self.view.addSubview(spacer)

//Constraints
var memoAreaToSpacer:NSLayoutConstraint = NSLayoutConstraint(item: spacer, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: memoArea, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 8)
spacerToBottom = NSLayoutConstraint(item: bottomLayoutGuide, attribute: NSLayoutAttribute.Top, relatedBy: .Equal, toItem: spacer, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0)
view.addConstraint(memoAreaToSpacer)
view.addConstraint(spacerToBottom)
...

所以当键盘发出通知时会发生这种情况。

func updateBottomLayoutConstraintWithNotification(notification: NSNotification) {
    let userInfo = notification.userInfo!


let animationDuration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as NSNumber).doubleValue
let keyboardEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
let convertedKeyboardEndFrame = view.convertRect(keyboardEndFrame, fromView: view.window)
let rawAnimationCurve = (notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as NSNumber).unsignedIntValue << 16
let animationCurve = UIViewAnimationOptions.init(UInt(rawAnimationCurve))

let frame = self.tabBarController?.tabBar.frame
let height = frame?.size.height
spacerToBottom.constant = CGRectGetMaxY(view.bounds) - CGRectGetMinY(convertedKeyboardEndFrame) - height! - 5

UIView.animateWithDuration(animationDuration, delay: 0.0, options: .BeginFromCurrentState | animationCurve, animations: {
    self.view.layoutIfNeeded()
    }, completion: nil)

}

这是完整的应用https://github.com/stanchiang/phoneHub

我正在谈论的代码位于viewDidLoad()的BaseDetailViewController.swift中。

我转移的约束是Main.storyboard文件中的编辑控制器。

另外,作为参考,我通过这篇博文发布了故事板。

http://effortlesscode.com/auto-layout-keyboard-shown-hidden/

感谢您的回答,仍然试图获得自动布局的支持,所以也欢迎一般提示。

1 个答案:

答案 0 :(得分:2)

我不是自动布局专家,但我会分享我所知道的内容:

  1. 您需要为要添加约束的视图关闭 AutoresizingMask

    view.setTranslatesAutoresizingMaskIntoConstraints(false)
    spacer.setTranslatesAutoresizingMaskIntoConstraints(false)
    memoArea.setTranslatesAutoresizingMaskIntoConstraints(false)
    
  2. 您将需要更多限制。我只在你的代码中看到2。您需要完全限制布局。这包括您现在使用框架(宽度,高度)指定的设置。如果您希望在键盘出现时移动所有内容,则可能应该相对于其他对象指定位置。当你在Storyboard中使用它时,整个ViewController必须有超过2个约束。你需要带来所有的限制。


  3. 我建议您添加以下6个约束来替换您使用框架设置的值。把这些与你的其他约束。我在评论中添加了视图框,以便您可以看到我获得值的位置:

        //var memoArea = UITextView(frame: CGRectMake(20, 291, 275, 225))
        memoArea.addConstraint(NSLayoutConstraint(item: memoArea, attribute: .Width, relatedBy: .Equal,
           toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 275.0))
    
        memoArea.addConstraint(NSLayoutConstraint(item: memoArea, attribute: .Height, relatedBy: .Equal,
            toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 225.0))
    
        self.view.addConstraint(NSLayoutConstraint(item: memoArea, attribute: .Leading, relatedBy: .Equal,
            toItem: self.view, attribute: .Leading, multiplier: 1.0, constant: 20.0))
    
        // var spacer:UIView = UIView(frame: CGRectMake(84, 518, 160, 6))
        spacer.addConstraint(NSLayoutConstraint(item: spacer, attribute: .Width, relatedBy: .Equal,
           toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 160.0))
    
        spacer.addConstraint(NSLayoutConstraint(item: spacer, attribute: .Height, relatedBy: .Equal,
            toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 6.0))
    
        self.view.addConstraint(NSLayoutConstraint(item: spacer, attribute: .Leading, relatedBy: .Equal,
            toItem: self.view, attribute: .Leading, multiplier: 1.0, constant: 84.0))