2015-04-01 82 views
1

我在界面生成器中创建了UITableView。里面是动态细胞。我说这样的限制(此方法被调用tableView:cellForRowAtIndexPath):启动应用程序和应用程序运行时UITableView中的自动布局结果会有所不同

@IBOutlet weak var rowView: UIView! 
@IBOutlet weak var flagImageView: UIImageView! 
@IBOutlet weak var computedRateLabel: UILabel! 
@IBOutlet weak var historyButton: UIButton! 

func buildConstraintsFor() { 
    let viewsDictionary = ["rowView": rowView, "flagImageView": flagImageView, "view1": computedRateLabel, "historyButton": historyButton] 

    rowView.layer.borderWidth = 1 
    flagImageView.layer.borderWidth = 1 
    computedRateLabel.layer.borderWidth = 1 
    historyButton.layer.borderWidth = 1 

    rowView.layer.borderColor = UIColor.blackColor().CGColor 
    flagImageView.layer.borderColor = UIColor.purpleColor().CGColor 
    computedRateLabel.layer.borderColor = UIColor.orangeColor().CGColor 
    historyButton.layer.borderColor = UIColor.greenColor().CGColor 

    // remove constraints 
    rowView.removeConstraints(rowView.constraints()) 
    historyButton.removeConstraints(historyButton.constraints()) 

    // add constraints 
    rowView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-[flagImageView]-[view1]-[historyButton]-|", options: nil, metrics: nil, views: viewsDictionary)) 
    rowView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-1-[flagImageView]-1-|", options: nil, metrics: nil, views: viewsDictionary)) 
    rowView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-1-[view1]-1-|", options: nil, metrics: nil, views: viewsDictionary)) 
    rowView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-1-[historyButton]-1-|", options: nil, metrics: nil, views: viewsDictionary)) 

    // size 
    historyButton.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[historyButton(==25)]", options: nil, metrics: nil, views: viewsDictionary)) 
    rowView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[rowView(<=68)]", options: nil, metrics: nil, views: viewsDictionary)) 
    rowView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[rowView(>=67)]", options: nil, metrics: nil, views: viewsDictionary)) 
    flagImageView.addConstraint(NSLayoutConstraint(item: flagImageView, attribute: .Width, relatedBy: .Equal, toItem: flagImageView, attribute: .Height, multiplier: 1, constant: 0)) 
} 

当我运行应用程序,我得到下面这正是我想要 enter image description here

当我滚动的TableView和时行消失,重新出现(或当我去到另一个的viewController和回来)我得到以下几点:

enter image description here

我不明白为什么。 如果我补充一点:

let width = UIScreen.mainScreen().applicationFrame.size.width 
rowView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:[rowView(==\(width))]", options: nil, metrics: nil, views: viewsDictionary)) 

这似乎是解决这个问题,但是当我去的风景不工作了。

当我做了布局时,我做错了吗?

编辑:

当我在这里加入他们后打印的rowView的所有约束的描述是我所得到的:

<NSLayoutConstraint:0x17009f3b0 UIImageView:0x1701f5a00.leading == UITableViewCellContentView:0x1701968c0.leadingMargin> 
<NSLayoutConstraint:0x17009f6d0 H:[UIImageView:0x1701f5a00]-(NSSpace(8))-[UILabel:0x13760f7f0'12 106,98']> 
<NSLayoutConstraint:0x17009f9a0 H:[UILabel:0x13760f7f0'12 106,98']-(NSSpace(8))-[UIButton:0x137634b60]> 
<NSLayoutConstraint:0x17009dec0 UITableViewCellContentView:0x1701968c0.trailingMargin == UIButton:0x137634b60.trailing> 
<NSLayoutConstraint:0x170098920 V:|-(1)-[UIImageView:0x1701f5a00] (Names: '|':UITableViewCellContentView:0x1701968c0)> 
<NSLayoutConstraint:0x17009a4a0 V:[UIImageView:0x1701f5a00]-(1)-| (Names: '|':UITableViewCellContentView:0x1701968c0)> 
<NSLayoutConstraint:0x174098dd0 V:|-(1)-[UILabel:0x13760f7f0'12 106,98'] (Names: '|':UITableViewCellContentView:0x1701968c0)> 
<NSLayoutConstraint:0x174099550 V:[UILabel:0x13760f7f0'12 106,98']-(1)-| (Names: '|':UITableViewCellContentView:0x1701968c0)> 
<NSLayoutConstraint:0x170283c00 V:|-(1)-[UIButton:0x137634b60] (Names: '|':UITableViewCellContentView:0x1701968c0)> 
<NSLayoutConstraint:0x1702837a0 V:[UIButton:0x137634b60]-(1)-| (Names: '|':UITableViewCellContentView:0x1701968c0)> 
<NSLayoutConstraint:0x170283d90 V:[UITableViewCellContentView:0x1701968c0(<=68)]> 
<NSLayoutConstraint:0x170283de0 V:[UITableViewCellContentView:0x1701968c0(>=67)]> 
+0

检查这种方法:[http://stackoverflow.com/questions/29231390/uitableview-strange-layout-behavior-changes-on-scroll/29327082#29327082 ] [1] [1]:http://stackoverflow.com/questions/29231390/uitableview-strange-layout-behavior-changes-on-scroll/29327082#29327082 – Ram 2015-04-01 10:41:37

+0

并不能真正帮助作为对于我来说,我设置了所有的约束条件(我没有看到哪一个缺失),并且答案中提供的链接没有以编程方式讨论约束条件,但是在IB中 – Nico 2015-04-01 11:01:23

+0

尝试将autosizingMask添加到rowView rowView.autoresizingMask = UIViewAut oresizing。FlexibleWidth – Ram 2015-04-01 11:13:49

回答

0

我后,我发现,因为它可能会帮助解决。感谢拉姆的帮助。

事实上,当您以编程方式使用自动布局时,不要忘记在要添加约束的每个组件上添加setTranslatesAutoresizingMaskIntoConstraints(false)

在我的情况下,我在界面生成器中创建了约束条件,并且因为我需要在运行时从行中删除UILabel,所以必须重新创建我的行的约束条件(例如宽高比,宽度或高度)。因此,我只想更改我的组件在我的行中的位置,但我不需要重新创建flagImageViewhistoryButton的约束条件,只要我不删除它们即可。

但我需要从我的rowView中删除约束,因为我正在添加新的并删除一些。这rowView实际上是我的UITableViewCellcontentView。通过消除约束条件,我还删除了与其superView实际上是UITableViewCell本身相关的约束条件。所以我的contentView和它的父母不一样大小。所以我只需要添加以下两行:

rowView.superview?.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[rowView]-0-|", options: nil, metrics: nil, views: viewsDictionary)) 
rowView.superview?.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[rowView]-0-|", options: nil, metrics: nil, views: viewsDictionary))