iOS - subivew无法在UITableViewCell中居中

时间:2017-06-20 11:50:28

标签: ios swift xcode uitableview autolayout

真的很奇怪。 无论我如何设置约束,它都会在布局后忽略所有约束。 我尝试在cell.indicator.center = cell.center中使用cell.indicator.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 但仍然没有奏效。 是否有任何特殊的方法可以将子视图集中在UITableViewCell

LoadingCell.xib

enter image description here

截图(模拟器)

enter image description here

更新

在尝试了@Vibha Singh的建议后,我将这些代码放在我的LoadingCell中。

override func layoutSubviews() {
    print("layoutSubviews")
    print(center)
    print(contentView.bounds)
    indicator.center = contentView.center
}

它打印出这些线条:

layoutSubviews
(207.0, 1055.16668891907)
(0.0, 0.0, 414.0, 44.6666666666667)

但该指标仍未居中。

更新

我通过创建一个带指示符的新单元来修复它。 它们都有完全相同的约束。新的按预期居中,但旧的仍然位于左上角。

更新

我第一次使用centerX和centerY作为约束。但它没有奏效。所以我必须尝试另一种方式。这就是我在第一个屏幕截图中使用这么多限制的原因。

以下是两个完全相同的xib的截图。

他们都使用相同的代码出列。

let dequeue = tableView.dequeueReusableCell(withIdentifier: SharedCell.loading.rawValue, for: indexPath)

if let cell = dequeue as? CenterLoadingCell {
    cell.indicator.startAnimating()
}
else if let cell = dequeue as? LoadingCell {
    cell.indicator.startAnimating()
}

return dequeue

第一个名为LoadingCell,不以模拟器为中心。

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

第二个名为CenterLoadingCell,我在问这个问题之后创建了它。而这一个以模拟器为中心。

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

3 个答案:

答案 0 :(得分:1)

您通过添加不必要的约束来混淆布局设置的大时间。检查此实现。

Image with Constraint

使用自定义单元格: enter image description here

答案 1 :(得分:0)

您可以添加

等指标
  let activityView = UIActivityIndicatorView(activityIndicatorStyle: .gray)
                            activityView.center = CGPoint(x: CGFloat(cell.bounds.midX), y: CGFloat(cell.bounds.midY))

                            cell.contentView.addSubview(activityView)
                            activityView.startAnimating()

或者你可以在下面的单元格方法中设置框架

override func layoutSubviews()
{
}

答案 2 :(得分:0)

您可以使用约束轻松实现

func setConstraints(item:UIView , relatedTo:UIView , attr:NSLayoutAttribute , relatedBy:NSLayoutRelation , multiplier: CGFloat , constant : CGFloat)

{
    relatedTo.addSubview(item)
    item.translatesAutoresizingMaskIntoConstraints = false
    NSLayoutConstraint(item: item, attribute: attr, relatedBy: relatedBy, toItem: relatedTo, attribute: attr, multiplier: multiplier, constant: constant).isActive = true




}

和用法:

setConstraints(item: indicator, relatedTo:cell.contentView, attr:centerX, relatedBy:.equal, multiplier: 0 , constant : 0)