在 Swift 中获取任何 UIView 的中心

Get center of any UIView in Swift

我正在尝试编写一个全局函数,通过调用此类函数将 activityIndi​​cator 添加到任何视图(不过主要是 imageViews)。

我现在拥有的功能是:

public func addActivityIndicatorToView(activityIndicator: UIActivityIndicatorView, view: UIView){

    //activityIndicator configuration ...
    activityIndicator.center = view.center
    view.addSubview(activityIndicator)
    activityIndicator.startAnimating()
}

但是由于某种原因我没有看到视图的中心。

我也尝试过围绕 SO 和 Google 的各种解决方案,但 none 一直有效到现在。

有什么方法可以获取中心点并将activityIndi​​cator设置为任何UIView吗?

center 属性 是相对于视图的父视图。因此,如果您的视图框架是 {10, 10, 20, 20}center 将是 {20, 20}

我猜您想将 activityIndicator 置于 view 的中心。

你可以做到

activityIndicator.center = CGPointMake(view.width/2, view.height/2)

原答案:

我很容易地重现了你的问题(见我的评论)。 我认为这可能是自动布局的问题。那么您可以使用约束来代替计算位置吗?

func addActivityIndicatorToView(activityIndicator: UIActivityIndicatorView, view: UIView){

    self.view.addSubview(activityIndicator)

    //Don't forget this line
    activityIndicator.setTranslatesAutoresizingMaskIntoConstraints(false)
    view.addConstraint(NSLayoutConstraint(item: activityIndicator, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: activityIndicator, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0))


    activityIndicator.startAnimating()


}

Swift5.0 的更新代码:

  • 来自 Rob
  • 的编辑
  • NSLayoutAttribute.CenterX 现在是 NSLayoutConstraint.Attribute.centerX
  • NSLayoutRelation.Equal 现在是 NSLayoutConstraint.Relation.equal
  • NSLayoutAttribute.CenterY 现在是 NSLayoutConstraint.Attribute.centerY
func addActivityIndicatorToView(activityIndicator: UIActivityIndicatorView, view: UIView){

    self.view.addSubview(activityIndicator)

    //Don't forget this line
    activityIndicatorView.translatesAutoresizingMaskIntoConstraints = false
    view.addConstraint(NSLayoutConstraint(item: activityIndicator, attribute: NSLayoutConstraint.Attribute.centerX, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerX, multiplier: 1, constant: 0))
    view.addConstraint(NSLayoutConstraint(item: activityIndicator, attribute: NSLayoutConstraint.Attribute.centerY, relatedBy: NSLayoutConstraint.Relation.equal, toItem: view, attribute: NSLayoutConstraint.Attribute.centerY, multiplier: 1, constant: 0))

    activityIndicator.startAnimating()

}

Swift 3:

activityIndicator.center = CGPoint(x: view.width/2, y: view.height/2)

或者你可以试试:

activityIndicator.center = view.center