如何将视图顶部对齐Xcode 6.1中父视图的高度的一半

时间:2014-11-12 05:38:27

标签: view alignment autolayout container-view

我正在尝试将白色子视图的顶部对齐到viewcontroller中容器视图的一半高度。见附图。 在旧版本的Xcode中,可以从视图中CTRL拖动到容器视图并选择“与容器视图的顶部对齐”,但在新的Xcode 6.1中,它们仅提供与“TopLayout指南”的对齐。所以我使用了这个约束并设置了约束,就像你在图像的右侧看到的那样。 根据我的阅读,以下等式适用:

property1 = property2 *乘数+常数。

所以我想用我的设置做到这一点: View.top = TopLayoutGuide.bottom * 0.5 + 0

这样白色“View”的顶部与TopLayoutGuide.bottom的高度的一半对齐。 但是,当我这样做时,结果是。)完全被忽略了,白色视图的顶部与TopLayouGuide.bottom对齐,基本上覆盖了整个屏幕。

有人可以弄清楚我做错了什么,将View的顶部与容器高度的一半对齐的正确方法是什么?

感谢

-Malena see image below

2 个答案:

答案 0 :(得分:1)

我遇到了与Xcode 6.1相同的问题。我发现有几种方法可以仅使用故事板编辑器通过添加子视图将视图(几乎)分成两半来用作一种基准。 iMemon程序化解决方案有效,但它需要额外的代码来限制使用中间点作为参考的任何对象,这可能会变得乏味。

解决您的问题:

  1. 将另一个视图添加到控制器的主视图中。
  2. 给它一种突出背景的颜色。
  3. 给它一个高度为1。
  4. 将其移至主视图的中心,并在容器中为其提供"垂直中心"约束
  5. 现在,您可以拖动任何对象的顶部或底部,以与刚刚添加的视图的框架对齐。您可以通过控制+单击+从任何对象拖动到新视图并从弹出菜单中选择适当的约束来应用约束。
  6. 将基准视图的颜色更改为使其在应用程序中不可见的颜色。我只是使用了清晰的颜色,因为我想要对齐的对象也很清晰,我有一个背景。如果清除不起作用,您可以尝试约束基准视图的宽度以匹配您对齐的对象的宽度,然后给它们相同的颜色。
  7. 您可以将使用视图作为基准的概念扩展到其他情况,例如与两个对象之间距离的点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.
}
}

希望这可以帮助你:)