以编程方式在 UITableViewCell 上设置约束

Posted

技术标签:

【中文标题】以编程方式在 UITableViewCell 上设置约束【英文标题】:Programmatically setting constraints on UITableViewCell 【发布时间】:2017-07-26 11:06:38 【问题描述】:

到目前为止,我一直在使用故事板来设置约束,但我正在尝试学习如何以编程方式做事。手头的问题:

表格需要返回cellForRowAt 中的单元格。在那里我只需要添加一个 UILabel 元素,该元素将约束到左上角和右下角的锚点。表格单元格高度设置为自动,因为我不知道标签的大小。我的代码如下所示:

var uil = UILabel()

cell.addSubview(uil)
uil.leftAnchor.constraint(equalTo: cell.leftAnchor).isActive = true
uil.rightAnchor.constraint(equalTo: cell.rightAnchor).isActive = true
uil.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true
uil.bottomAnchor.constraint(equalTo: cell.bottomAnchor).isActive = true
uil.numberOfLines = 0;
uil.text = "Some variable sized text that could be anything really";

如果我不给UILabel 一个框架,我什么也看不到。但是,如果我使用类似的东西:

UILabel(frame: CGRect(x: 0 , y: 0 , width: 100, height: 100)

然后正如预期的那样,我看到了标签,但好像约束不适用。

我错过了什么?约束不应该是足够的,因为它们是完全描述性的吗?

【问题讨论】:

【参考方案1】:

如果你是动态添加视图那么你需要设置view.translatesAutoresizingMaskIntoConstraints = false

更多详情click here

然后应用以下约束,因为它会起作用。

// align lbl from the left and right
cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-8-[view]-8-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": lbl]));

// align lbl from the top and bottom
cell.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[view]-8-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view": lbl]));

【讨论】:

【参考方案2】:

我认为你应该在应用约束之前添加这一行

uil.translatesAutoresizingMaskIntoConstraints = false

【讨论】:

【参考方案3】:

这是一个工作代码 sn-p,我已经在视图控制器中完成了,您可以对单元格执行相同操作

 var uil:UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()
        self.uil = UILabel()
        self.uil?.translatesAutoresizingMaskIntoConstraints = false
        self.uil?.backgroundColor = UIColor.red
        self.uil?.text = "label text"
        self.uil.addSubview(self.uil!)
        self.uil?.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant:10).isActive = true
        self.uil?.topAnchor.constraint(equalTo: view.topAnchor, constant:50).isActive = true
        self.uil?.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant:-10).isActive = true
        self.uil?.heightAnchor.constraint(equalToConstant: 20.0).isActive = true


    

【讨论】:

【参考方案4】:

以下是我们如何应用约束的示例。我以标签为例。

UILabel *lb1;
lb1 =[[UILabel alloc]init];
self.view addSubview:lb1];

lb1.translatesAutoresizingMaskIntoConstraints = NO;

// 水平约束

NSLayoutConstraint *centreHorizontallyConstraint = [NSLayoutConstraint constraintWithItem:lb1 attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];

//垂直约束

NSLayoutConstraint *centreVeryConstraint = [NSLayoutConstraint constraintWithItem:lb1 attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];

//高度约束

NSLayoutConstraint * lblheight = [NSLayoutConstraint constraintWithItem:lb1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:30];

//宽度限制

NSLayoutConstraint * lblwidth = [NSLayoutConstraint constraintWithItem:lb1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:80];

//添加约束

[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];

【讨论】:

以上是关于以编程方式在 UITableViewCell 上设置约束的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在 UITableViewCell 上显示删除按钮

以编程方式在 UITableViewCell 上设置约束

无法在 UITableViewCell 中以编程方式创建的 UIButton 上设置图像

想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?

以编程方式在 UITableViewCell 内创建 UIScrollView - ScrollView 不滚动

iOS 在 UITableViewCell 中以编程方式设置 UIImageView 约束在滚动 tableview 时变得混乱