Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-subivew可以';不能在UITableViewCell中居中_Ios_Swift_Xcode_Uitableview_Autolayout - Fatal编程技术网

iOS-subivew可以';不能在UITableViewCell中居中

iOS-subivew可以';不能在UITableViewCell中居中,ios,swift,xcode,uitableview,autolayout,Ios,Swift,Xcode,Uitableview,Autolayout,真奇怪。 无论我如何设置约束,它只是在布局之后忽略所有约束。 我已经尝试在func表视图(u表视图:UITableView,cellForRowAt indexPath:indexxpath)->UITableViewCell)中使用cell.indicator.center=cell.center和cell.indicator.autoresizingMask=[.flexibleleleleftmargin、.flexibleRightMargin、.flexibleTopMargin、.f

真奇怪。 无论我如何设置约束,它只是在布局之后忽略所有约束。 我已经尝试在
func表视图(u表视图:UITableView,cellForRowAt indexPath:indexxpath)->UITableViewCell)中使用
cell.indicator.center=cell.center
cell.indicator.autoresizingMask=[.flexibleleleleftmargin、.flexibleRightMargin、.flexibleTopMargin、.flexibleBottomMargin]
但仍然不起作用。 在
UITableViewCell
中,是否有任何特殊方法可以将子视图居中

LoadingCell.xib

屏幕截图(模拟器)

更新:

在尝试了@Vibha Singh的建议后,我将这些代码放在我的
加载单元中

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
,是我在提出这个问题后创建的。这个以模拟器为中心


您可以添加如下指示器

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

由于添加了不必要的约束,布局设置非常混乱。检查此实现

使用自定义单元格:

您可以通过约束轻松实现

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)

是否可以添加有关正在使用的约束的更多信息?设置
cellForRow
中的中心将不起作用,因为之后会进行更多的布局尝试使用
cell.indicator.center=cell.contentView?.center
而不是使用
cell.indicator.center=cell.center
@CatalinaT。您可以在第一张图像中看到所有约束。仅在指示器centreX和centreY上添加两个约束,并删除所有其他约束无需执行任何其他操作仅添加两个约束,删除所有约束,并将代码添加到中心itTried。我第一次确实使用了这些约束。但它不起作用。因此,我尝试了另一种方法来查看它是否有效。我也尝试了自定义单元格实现。检查附加的另一个屏幕截图。刚刚创建了另一个带有指示器的单元格,并且仅使用centerX和centerY约束。这一个按预期居中。但是原始的
加载单元仍然没有居中。它们都有完全相同的约束。这是否意味着原始的
LoadingCell
有来自autolayout的内部问题?不能不看两个单元格就说它对您有效。我上传了关于这两个XIB的截图。希望能有所帮助。