我正在尝试将白色子视图的顶部对齐到viewcontroller中容器视图的一半高度。见附图。 在旧版本的Xcode中,可以从视图中CTRL拖动到容器视图并选择“与容器视图的顶部对齐”,但在新的Xcode 6.1中,它们仅提供与“TopLayout指南”的对齐。所以我使用了这个约束并设置了约束,就像你在图像的右侧看到的那样。 根据我的阅读,以下等式适用:
property1 = property2 *乘数+常数。
所以我想用我的设置做到这一点: View.top = TopLayoutGuide.bottom * 0.5 + 0
这样白色“View”的顶部与TopLayoutGuide.bottom的高度的一半对齐。 但是,当我这样做时,结果是。)完全被忽略了,白色视图的顶部与TopLayouGuide.bottom对齐,基本上覆盖了整个屏幕。
有人可以弄清楚我做错了什么,将View的顶部与容器高度的一半对齐的正确方法是什么?
感谢
-Malena
答案 0 :(得分:1)
我遇到了与Xcode 6.1相同的问题。我发现有几种方法可以仅使用故事板编辑器通过添加子视图将视图(几乎)分成两半来用作一种基准。 iMemon程序化解决方案有效,但它需要额外的代码来限制使用中间点作为参考的任何对象,这可能会变得乏味。
解决您的问题:
您可以将使用视图作为基准的概念扩展到其他情况,例如与两个对象之间距离的点3/4对齐。您可以向视图添加对象,在其中应用约束,然后移动视图并在其超级视图中应用约束。发挥创意并进行实验。
答案 1 :(得分:0)
您无法在Interface Builder中实现您想要的功能。但这可以通过代码创建约束来实现。我为您创建了一个示例项目,您可以download from Here
以下是通过代码添加约束的ViewController文件的代码。 注意:我在Interface Builder中添加了任意约束,因为我们需要获取主视图高度。那些也很重要
//
// ViewController.swift
// Test
//
// Created by FR-MAC on 11/12/14.
// Copyright (c) 2014 ABC. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var mySubview: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.addContraintsForMoviePlayerView(self.mySubview, superView: self.view)
}
func addContraintsForMoviePlayerView(var view:UIView, superView:UIView) -> Void {
view.setTranslatesAutoresizingMaskIntoConstraints(false)
let leftConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: superView, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0)
let rightConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: superView, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0)
let bottomConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: superView, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0)
var topValue:CGFloat = superView.frame.size.height
topValue = topValue/2
let topConstraint = NSLayoutConstraint(item: view, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: view.superview?, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: topValue)
// Remove the constraints created in Interface Builder to avoid autolayout constraint issues. We just added those constraints to get the correct height of self.view.frame which we used to create above topConstaint
self.view.removeConstraints(self.view.constraints())
//Add the above created constraints
superView.addConstraints( [leftConstraint, rightConstraint, topConstraint, bottomConstraint] )
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
希望这可以帮助你:)