加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 以编程方式添加CenterX/CenterY约束

发布时间:2020-12-15 02:01:20 所属栏目:百科 来源:网络整理
导读:我有一个UITableViewController,如果没有显示内容,它不显示任何部分。我添加了一个标签,向用户指出这个代码没有什么可以显示的: label = UILabel(frame: CGRectMake(20,20,250,100))label.text = "Nothing to show"self.tableView.addSubview(label) 但
我有一个UITableViewController,如果没有显示内容,它不显示任何部分。我添加了一个标签,向用户指出这个代码没有什么可以显示的:

label = UILabel(frame: CGRectMake(20,20,250,100))
label.text = "Nothing to show"
self.tableView.addSubview(label)

但现在我想让它以水平和垂直为中心。通常,我将在屏幕截图中选择突出显示的两个选项(加上高度和宽度)

我已经尝试了以下代码来添加约束,但应用程序崩溃与错误:

label = UILabel(frame: CGRectMake(20,100))
label.text = "Nothing to show"

let xConstraint = NSLayoutConstraint(item: label,attribute: .CenterX,relatedBy: .Equal,toItem: self.tableView,multiplier: 1,constant: 0)
let yConstraint = NSLayoutConstraint(item: label,attribute: .CenterY,constant: 0)

label.addConstraint(xConstraint)
label.addConstraint(yConstraint)

错误:

When added to a view,the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2014-12-23 08:17:36.755 [982:227877] *** Assertion failure in -[UILabel _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:],/SourceCache/UIKit/UIKit-3318.16.21/NSLayoutConstraint_UIKitAdditions.m:560

标签应始终水平和垂直居中,因为应用程序支持设备旋转。

我究竟做错了什么?如何成功添加这些约束?

谢谢!

解决方法

iOS 8及更高版本的更新:

[谢谢@ChrisHatton提醒我更新答案]

从iOS 8开始,您可以通过将其活动属性设置为true来激活约束。这使得约束能够将自己添加到正确的视图中。通过将包含约束的数组传递给NSLayoutConstraint.activateConstraints()可以一次激活多个约束,

let label = UILabel(frame: CGRectZero)
    label.text = "Nothing to show"
    label.textAlignment = .Center
    label.backgroundColor = .redColor()  // Set background color to see if label is centered
    label.translatesAutoresizingMaskIntoConstraints = false
    self.tableView.addSubview(label)

    let widthConstraint = NSLayoutConstraint(item: label,attribute: .Width,toItem: nil,attribute: .NotAnAttribute,multiplier: 1.0,constant: 250)

    let heightConstraint = NSLayoutConstraint(item: label,attribute: .Height,constant: 100)

    let xConstraint = NSLayoutConstraint(item: label,constant: 0)

    let yConstraint = NSLayoutConstraint(item: label,constant: 0)

    NSLayoutConstraint.activateConstraints([widthConstraint,heightConstraint,xConstraint,yConstraint])

原始答案:

约束引用了self.tableView。由于您将标签添加为self.tableView的子视图,因此需要将约束添加到“common ancestor”中:

self.tableView.addConstraint(xConstraint)
   self.tableView.addConstraint(yConstraint)

由于@mustafa和@kcstricks在注释中指出,您需要将label.translatesAutoresizingMaskIntoConstraints设置为false。执行此操作时,还需要使用约束来指定标签的宽度和高度,因为不再使用该框架。最后,您还应该将textAlignment设置为.Center,以使您的文本居中在标签中。

var  label = UILabel(frame: CGRectZero)
    label.text = "Nothing to show"
    label.textAlignment = .Center
    label.backgroundColor = UIColor.redColor()  // Set background color to see if label is centered
    label.translatesAutoresizingMaskIntoConstraints = false
    self.tableView.addSubview(label)

    let widthConstraint = NSLayoutConstraint(item: label,constant: 250)
    label.addConstraint(widthConstraint)

    let heightConstraint = NSLayoutConstraint(item: label,constant: 100)
    label.addConstraint(heightConstraint)

    let xConstraint = NSLayoutConstraint(item: label,constant: 0)

    self.tableView.addConstraint(xConstraint)
    self.tableView.addConstraint(yConstraint)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读