【发布时间】: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