什么限制会阻止我的UIViews堆叠在彼此之上?

时间:2016-04-05 22:02:26

标签: ios swift uitableview ios8 constraints

我的UIView正在堆叠在彼此之上:

enter image description here

每个UIView都位于wordContainer内。每个UIView里面都有两个UILabel

我用两个孩子的UILabel创建每个单独的UIView:

    var labels = [UIView]()
    for word in words {

        let wordLabel               = UILabel(frame: CGRectZero)
        wordLabel.text              = word.valueForKey("sanskrit") as? String
        wordLabel.numberOfLines     = 0
        wordLabel.sizeToFit()
        wordLabel.translatesAutoresizingMaskIntoConstraints = false

        let englishWordLabel           = UILabel(frame: CGRectMake(wordLabel.frame.width + 10,0,0,0))
        englishWordLabel.text          = word.valueForKey("english") as? String)
        englishWordLabel.numberOfLines = 0
        englishWordLabel.sizeToFit()
        englishWordLabel.lineBreakMode     = .ByWordWrapping
        englishWordLabel.translatesAutoresizingMaskIntoConstraints = false

        let wordView = UIView(frame: CGRectMake(0,0,self.view.frame.width,englishWordLabel.frame.height))
        wordView.translatesAutoresizingMaskIntoConstraints = false
        wordView.addSubview(wordLabel)
        wordView.addSubview(englishWordLabel)

        wordView.sizeToFit()

        labels.append(wordView)
    }

然后我拿这个UIView的集合并将它们添加到我的wordContainer。这是我想象的部分,我应该设置NSLayoutConstraints。我的想法是,我希望他们都能恰当地叠加在一起。例如,它应该如下所示:

word: definition
word: definition
word: definition
word: definition

但它看起来像这样:

enter image description here

我将它们添加到wordContainer中,如此:

    let wordContainer  = UIView(frame: CGRectZero)

    var currentY:CGFloat      = 0.0
    let margin_height:CGFloat = 4.0
    var height:CGFloat        = 0

    for view in wordViews {
        var rect = view.frame
        rect.origin.y = currentY
        view.frame = rect

        currentY += view.frame.height
        height += view.frame.height

        wordContainer.addSubview(view)

    }
    let containRect = CGRectMake(0,0,self.view.frame.width, height)
    wordContainer.frame = containRect

然后我为wordContainer设置约束,如果它们没有堆叠在一起,它们有效地允许所有单词的空间存在:

   wordContainer.bottomAnchor.constraintEqualToAnchor(cell.contentView.bottomAnchor).active     = true
   wordContainer.topAnchor.constraintEqualToAnchor(cell.contentView.topAnchor).active           = true

我最近的想法是,也许我应该为此添加约束。我已尝试将NSLayoutConstraints添加到cell的高度,当我执行所有单词时,不再适当地布置。相反,它们堆叠在彼此之上。但这似乎是正确的方向..

2 个答案:

答案 0 :(得分:2)

为了让单元格自动调整其高度,contentView中的内容必须对contentView的所有4个边缘都有约束。

我自己刚刚使用不同的单元格类型来处理文本,图像和嵌入式推文,并且遇到了一些您已经描述过的问题。我发现最简单的方法是在内容视图中的任何组件周围添加视图,然后您可以轻松地将约束添加到该元素周围。

我只是快速浏览一下可以证明这一点的内容,并找到了另一个SO answer,用一些屏幕截图解释了它。

我今天这样做的参考资料还是This post on Ray Wenderlich's site

答案 1 :(得分:0)

UITableViewController viewDidLoad()中,尝试:

//set up table view cell dynamic height
tableView.rowHeight = UITableViewAutomaticDimension

在故事板中,确保使用AutoLayout,并设置并修复了单元格元素对superview的所有约束。例如,单元格的顶部文本必须具有Superview定义的边距并设置为值。