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.center
和cell.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 中居中的主要内容,如果未能解决你的问题,请参考以下文章