iOS - subivew 不能在 UITableViewCell 中居中

Posted

技术标签:

【中文标题】iOS - subivew 不能在 UITableViewCell 中居中【英文标题】:iOS - subivew can't be centered in UITableViewCell 【发布时间】:2017-06-20 11:50:28 【问题描述】:

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

LoadingCell.xib

截图(模拟器)

更新:

在尝试了@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,不在模拟器的中心。

第二个名为CenterLoadingCell,是我在提出这个问题后创建的。而这个以模拟器为中心。

【问题讨论】:

您能否添加有关您正在使用的约束的更多信息?在cellForRow 中设置中心将不起作用,因为在那之后还有更多的布局 尝试使用cell.indicator.center = cell.contentView?.center insted 使用cell.indicator.center = cell.center @CatalinaT。您可以在第一张图片中看到所有约束。 在指标 centerX 和 centerY 上仅添加两个约束并删除所有其他约束,无需执行任何其他操作 只添加两个约束,删除所有约束和代码使其居中 【参考方案1】:

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

使用自定义单元格:

【讨论】:

试过了。我第一次确实使用了这些约束。但它不起作用。所以我尝试了另一种方法,看看它是否有效。 我也尝试过自定义单元实现,请查看附加的另一个屏幕截图。 刚刚创建了另一个带有指示器的单元格,并且只使用了 centerX 和 centerY 约束。这个如预期的那样居中。但原来的LoadingCell 仍然没有居中。它们都具有完全相同的约束。这是否意味着原来的LoadingCell 存在自动布局的内部问题? 不能不看两个单元格就说它对你有用。 我已经上传了关于这两个 xib 的截图。希望对您有所帮助。【参考方案2】:

你可以像这样添加指标

  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()


【讨论】:

【参考方案3】:

你可以通过约束轻松实现

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)

【讨论】:

以上是关于iOS - subivew 不能在 UITableViewCell 中居中的主要内容,如果未能解决你的问题,请参考以下文章

uisearchbar 在分组部分 uitable

关于 UITable 视图的异常

通过从上到下滚动表格来刷新 UITable 内容

Swift uiview 在 uitable 之上

如何在代码中使用 UItable 单元中的按钮插座

如何将文本包装在 Iphone 的 UITable 单元格中?