以编程方式添加标签,与Storyboard中的标签对齐

时间:2016-03-09 19:13:03

标签: ios uitableview autolayout swift2 ios9

期望的观点:

enter image description here

在Storyboard中,我有两个带有蓝色背景的标签,我在Autolayout中创建。他们的立场永远不会改变。接下来,我想在蓝色背景标签下方user = User.find(1) user.do something 的代码中添加1到10个标签。

我正在努力将代码中添加的标签(棕色背景)与在Autolayout(蓝色背景)中创建的标签对齐。

以下是我失败的尝试:

enter image description here

两种失败的方法:

  1. cellForRowAtIndexPath中获取" B AutoLayout Static Label"并将X位置用于动态标签。没用。

  2. 添加约束也不起作用 - 也许我没有正确添加约束。

  3. 以下是代码:

    cellForRowAtIndexPath

    以下是class TableViewController: UITableViewController { var cellHeight = [Int: CGFloat]() override func viewDidLoad() { super.viewDidLoad() tableView.estimatedRowHeight = 85.0 self.tableView.rowHeight = UITableViewAutomaticDimension } override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 4 } override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell let xLocation = cell.labelBStatic.frame.origin.x var yLocation = cell.labelBStatic.frame.origin.y let height = cell.labelBStatic.frame.size.height var startYLocation = yLocation + height + 20 var i = 0 if indexPath.row % 2 == 0 { i = 5 } else { i = 7 } while i < 10 { let aLabel = UILabel() aLabel.backgroundColor = UIColor.orangeColor() aLabel.text = "Label # \(i)" cell.contentView.addSubview(aLabel) addConstraints(aLabel, verticalSpacing: startYLocation) startYLocation += 20 i++ } print(startYLocation) cellHeight[indexPath.row] = startYLocation return cell } func addConstraints(labelView: UILabel, verticalSpacing: CGFloat) { // set Autoresizing Mask to false labelView.translatesAutoresizingMaskIntoConstraints = false //make dictionary for views let viewsDictionary = ["view1": labelView] //sizing constraints let view1_constraint_H:Array = NSLayoutConstraint.constraintsWithVisualFormat("H:[view1(>=50)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDictionary) labelView.addConstraints(view1_constraint_H) //position constraints let view_constraint_H:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("H:|-15-[view1]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDictionary) let view_constraint_V:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:|-\(verticalSpacing)-[view1]", options: NSLayoutFormatOptions.AlignAllLeading, metrics: nil, views: viewsDictionary) view.addConstraints(view_constraint_H as! [NSLayoutConstraint]) view.addConstraints(view_constraint_V as! [NSLayoutConstraint]) } override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { if let height = cellHeight[indexPath.row] { return height } return 0 } 设置(两个标签都水平居中):

    enter image description here

    问题:如何让我在Storyboard创建的动态标签与cellForRowAtIndexPath中创建的静态标签保持一致,以匹配我在顶部的所需视图?

1 个答案:

答案 0 :(得分:3)

为了演示目的,我已经以编程方式添加了一个标签,您可以添加所需的标签,只需正确添加约束,还需要将bottomSpace约束添加到单元格内的最后一个标签,以便您的单元格自动调整大小根据标签高度。

按照我所做的步骤来实现您的目标:

  1. 访问cellForRowAtIndexPath中的B AutoLayout静态标签:如果您已经创建了UITableViewCell并创建了插座,则使用标签或插座。

    let labelBAutolayoutStaticLabel = cell?.viewWithTag(20)
    
  2. 以编程方式创建标签,如下所示,并将translatesAutoresizingMaskIntoConstraints设置为false,

    let labelDynamicLabel = UILabel()
    labelDynamicLabel.backgroundColor = UIColor.orangeColor()
    labelDynamicLabel.text = "A Dynamic Label"
    labelDynamicLabel.translatesAutoresizingMaskIntoConstraints = false
    cell?.contentView.addSubview(labelDynamicLabel)
    
  3. 您需要创建两个约束,一个用于TopSpace,第二个是LeadingSpace,如下所示,

    let leadingSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint(item: labelDynamicLabel, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: labelBAutolayoutStaticLabel, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: 0);
    
    let topSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint(item: labelDynamicLabel, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: labelBAutolayoutStaticLabel, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 10); //Constant is the spacing between
    
  4. 在您的手机内容视图中添加约束,如下所示

    cell?.contentView.addConstraint(leadingSpaceConstraint)
    cell?.contentView.addConstraint(topSpaceConstraint)
    
  5. 那就是它。

    这是结果,

    enter image description here

    以下是cellForRowAtIndexPath的完整代码:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCellWithIdentifier("cell")
    
        let labelBAutolayoutStaticLabel = cell?.viewWithTag(20)
    
    
        let labelDynamicLabel = UILabel()
        labelDynamicLabel.backgroundColor = UIColor.orangeColor()
        labelDynamicLabel.text = "A Dynamic Label"
        labelDynamicLabel.translatesAutoresizingMaskIntoConstraints = false
        cell?.contentView.addSubview(labelDynamicLabel)
    
        let leadingSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint(item: labelDynamicLabel, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: labelBAutolayoutStaticLabel, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: 0);
    
        let topSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint(item: labelDynamicLabel, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: labelBAutolayoutStaticLabel, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 10);
    
        cell?.contentView.addConstraint(leadingSpaceConstraint)
        cell?.contentView.addConstraint(topSpaceConstraint)
    
        return cell!
    }
    

    修改/更新

    如果必须将bottomSpace约束设置为最后一个标签(位于单元格底部的标签),则有两种方式

    1. 使用NSLayoutConstraint如下:

      let bottomSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint(item: labelDynamicLabel, attribute: NSLayoutAttribute.BottomMargin, relatedBy: NSLayoutRelation.Equal, toItem: cell.contentView, attribute: NSLayoutAttribute.BottomMargin, multiplier: 1, constant: -8)
      
      cell.contentView.addConstraint(bottomSpaceConstraint)
      
    2. 使用如下的视觉格式语言,

      let views = ["cell": cell, "labelDynamicLabel": labelDynamicLabel, "labelBAutolayoutStaticLabel": labelBAutolayoutStaticLabel]
      
      let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[labelBAutolayoutStaticLabel]-[labelDynamicLabel]-|", options: [], metrics: nil, views: views)
      
      cell.contentView.addConstraints(verticalConstraints)
      
    3. 如果使用VFL设置约束,请确保删除topSpaceConstraint

      //cell.contentView.addConstraint(topSpaceConstraint)
      

      这个&#34; V:[labelBAutolayoutStaticLabel] - [labelDynamicLabel] - |&#34; 字符串的意思是,

      1. labelDynamicLabel应该将TopSpace标记为带有standardSpacing(8pts)的labelButolayoutStaticLabel,而labelDynamicLabel应该具有使用standardSpacing的SuperView的底部空间。 (&#39; - |&#39;表示superView的标准空间)