【问题标题】:Move button after adding subview添加子视图后移动按钮
【发布时间】:2014-12-11 14:58:41
【问题描述】:

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

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

可选("V:|-50-[viewXIB0(100)]-30-[buttonKey]")

可选("V:|-50-[viewXIB1(100)]-30-[viewXIB0(100)]-30-[buttonKey]")

可选("V:|-50-[viewXIB2(100)]-30-[viewXIB1(100)]-30-[viewXIB0(100)]-30-[buttonKey]")

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

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

在构建或运行时没有约束错误。当我的计算机运行速度非常慢时,我确实看到它短暂地出现在正确的位置,然后卡到屏幕顶部。我想我也能听到它在嘲笑我,但这可能是个玩笑。两个视图控制器都启用了自动布局。

我用来通过内部按钮的修饰添加视图的完整方法是:

@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 视频,并搜索过类似的问题,但事实上,我现在很困惑,我什至不知道该搜索什么。

【问题讨论】:

  • 不应该是 child.myButton.frame 而不是实际的整个视图本身 (vc.view),因为这会使所有内容都向下移动。如果您想使用 Autolayout,您可以像设置视图一样为顶部约束设置 IBOutlet,然后将其更改为 .constant(可能需要调用 view.layoutifneed)。
  • 您可以尝试在方法中移动您的按钮:视图控制器的-(void)viewDidLayoutSubviews
  • 要移动启用了 AutoLayout 的 UIButton,您必须调整按钮的约束。一种方法是通过@BooRanger 建议的IBOutlets。 A similar (possible duplicate) question is posted here,不同的是这里使用的是Objective-C。
  • @BooRanger,我正在使用按钮添加 VC,将按钮保持在最后一个 VC 下方是挑战。
  • 您不必以编程方式创建按钮来访问约束。只需为相应的约束创建一个IBOutlet 并对其进行操作。在我上面链接的问题中查看 RJR 的答案。这应该对你有帮助。

标签: ios xcode swift view viewcontroller


【解决方案1】:

根据 BooRanger 的评论,通过将 IBOutlet 添加到顶部和底部约束,可以在每次按下按钮时操纵视图。然而,归根结底,集合视图是一种更简单的添加和删除视图的方法。

【讨论】:

  • 评论可能随时被删除 - 为了后代,您能否编辑您的答案以包含您认为有用的信息的相关部分?非常感谢。
猜你喜欢
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2015-03-09
相关资源
最近更新 更多