以编程方式在 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 中以编程方式创建的 UIButton 上设置图像
想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?
以编程方式在 UITableViewCell 内创建 UIScrollView - ScrollView 不滚动
iOS 在 UITableViewCell 中以编程方式设置 UIImageView 约束在滚动 tableview 时变得混乱