添加子视图后移动按钮

时间:2014-12-11 14:58:42

标签: ios xcode swift view viewcontroller

以下评论编辑 - 使用约束来控制布局。

我正在尝试通过按钮添加/删除在故事板中设置的视图控制器。按钮和任何以前添加的视图应按照以下可视格式字符串在屏幕上向下移动:

可选(&#34,V:| -50- [viewXIB0(100)] - 30- [buttonKey]&#34)

可选(&#34,V:| -50- [viewXIB1(100)] - 30- [viewXIB0(100)] - 30- [buttonKey]&#34)

可选(&#34,V:| -50- [viewXIB2(100)] - 30- [viewXIB1(100)] - 30- [viewXIB0(100)] - 30- [buttonKey]&#34)

(这是输入NSLayoutConstraint.constraintsWithVisualFormat的可视格式字符串的println输出。)

感谢下面的评论,每次按下按钮时都会显示视图,并正确向下移动页面。但是,superview和顶视图之间的间距为零 - 没有边距。添加其他视图时也会出现类似问题 - 每个视图都隐藏在间距下方。底部间距大于所需的30。并且,在几次插入之后,甚至更奇怪的东西开始朝向屏幕顶部发生。

iPhone6 with messed up autolayout

构建或运行时没有约束错误。当我的计算机运行速度超慢时,我确实看到它在正确的位置短暂显示,然后捕捉到屏幕顶部。我想我也能听到它嘲笑我,但那可能是个玩笑。两个视图控制器都启用了Autolayout。

我用来从内部按钮添加视图的完整方法是:

@IBAction func addVCBenj(sender: AnyObject)
{
    // remove original constraint from button
    if (topConstraintBenjV != nil)
    {
        view.removeConstraint(topConstraintBenjV)
        topConstraintBenjV = nil
        println("addVCBen constraints removed")
    }
    // remove previous constraints as views are added
    if (constraintV != nil)
    {
        view.removeConstraints(constraintV!)
        println("removed")
    }

    // instantiate add add the view within the storyboard VC
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let myVC = storyboard.instantiateViewControllerWithIdentifier("VCtoInsert") as UIViewController
    view.addSubview(myVC.view)

    // create and add a unique key for each view in the dictionary of views
    viewsDictionaryKey = "\(viewsDictionaryString)\(viewsDictionaryCounter)"
    viewsDictionaryCounter += 1
    viewsDictionary[viewsDictionaryKey!] = myVC.view

    // create the visual format string for layout
    suffixVisualFormatString_V = "[" + viewsDictionaryKey! + "(100)]-30-" + suffixVisualFormatString_V
    visualFormatString_V = prefixVisualFormatString_V + suffixVisualFormatString_V
    println(visualFormatString_V)

    // create and add horizontal and vertical constraints
    let constraintH = NSLayoutConstraint.constraintsWithVisualFormat("H:[\(viewsDictionaryKey!)(>=300)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)

    myVC.view.setTranslatesAutoresizingMaskIntoConstraints(false)
    constraintV = NSLayoutConstraint.constraintsWithVisualFormat(visualFormatString_V!, options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
    self.view.addConstraints(constraintV!)
    self.view.addConstraints(constraintH)
}

我已经看过WWDC视频,并搜索了类似的问题,但事实上,我现在很困惑,我不知道甚至可以搜索什么。

1 个答案:

答案 0 :(得分:0)

根据BooRanger的评论,通过在顶部和底部约束处添加IBOutlet,可以在每次按下按钮时操纵视图。但最终,集合视图是添加和删除视图的更简单方法。