Ios 以编程方式在UITableViewCell上设置约束
到目前为止,我一直在使用故事板来设置我的约束,但我正在尝试学习如何以编程方式进行操作。当前的问题是:Ios 以编程方式在UITableViewCell上设置约束,ios,uitableview,autolayout,constraints,Ios,Uitableview,Autolayout,Constraints,到目前为止,我一直在使用故事板来设置我的约束,但我正在尝试学习如何以编程方式进行操作。当前的问题是: [self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]]; 表格需要返回cellForRowAt中的单元格。在那里,我只需要添加一个UILabel元素,该元素将被约束到左上下和右上的锚定。表格单元格高度设置为自动,因为我不知道标签的大小。我的代码如下所示:
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
表格需要返回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";
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
如果我不给ui标签一个框架,我什么也看不到。但是,如果我这样做,请使用以下内容:
UILabel(frame: CGRect(x: 0 , y: 0 , width: 100, height: 100)
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
然后,正如预期的那样,我看到了标签,但好像约束不适用
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
我错过了什么?约束是完全描述性的,难道还不够吗?我认为您应该在应用约束之前添加这一行
uil.translatesAutoresizingMaskIntoConstraints = false
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
我认为您应该在应用约束之前添加这一行
uil.translatesAutoresizingMaskIntoConstraints = false
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
如果要动态添加视图,则需要设置view.translatesAutoResizezingMaskintoConstraints=false
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
欲知详情
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
然后应用下面的约束,因为它将起作用
// 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]));
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
如果要动态添加视图,则需要设置view.translatesAutoResizezingMaskintoConstraints=false
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
欲知详情
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
然后应用下面的约束,因为它将起作用
// 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]));
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
这里有一个工作代码片段,我已经在view controller中完成了,您可以对单元格执行同样的操作
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
}
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
这里有一个工作代码片段,我已经在view controller中完成了,您可以对单元格执行同样的操作
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
}
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
下面是一个如何应用约束的示例。我将以标签为例
UILabel *lb1;
lb1 =[[UILabel alloc]init];
self.view addSubview:lb1];
lb1.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
//水平约束
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]];
//垂直约束
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]];
//高度限制
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]];
//宽度限制
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]];
//添加约束
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
下面是一个如何应用约束的示例。我将以标签为例
UILabel *lb1;
lb1 =[[UILabel alloc]init];
self.view addSubview:lb1];
lb1.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];
//水平约束
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]];
//垂直约束
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]];
//高度限制
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]];
//宽度限制
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]];
//添加约束
[self.view addConstraints:@[centreHorizontallyConstraint,centreVeryConstraint,lblheight,lblwidth]];