【问题标题】:Get center of any UIView in Swift在 Swift 中获取任何 UIView 的中心
【发布时间】:2015-07-24 00:58:14
【问题描述】:

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

我现在拥有的功能是:

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

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

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

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

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

【问题讨论】:

  • 如果@EmilioPelaez 中的任何解决方案都不起作用,我建议您检查视图的大小。你用什么方法设置活动指示器的中心?
  • 在一个全局类中,包含了整个项目共享的所有方法
  • 您可以在正确设置视图框架之前设置activityIndicator 的位置(例如在viewDidLoad 中)...
  • println("activityIndicator.center before = \(activityIndicator.center.x) x \(activityIndicator.center.y)") activityIndicator.center = view.center println("activityIndicator.center after = \(activityIndicator.center.x) x \(activityIndicator.center.y)") 表明中心已经改变。我会考虑刷新问题,而不是居中。

标签: swift uiview center


【解决方案1】:

原答案:

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

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


}

Swift 5.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()

}

【讨论】:

  • 太棒了!感谢您的评论和这段令人惊叹的代码。现在一切正常。
  • 这绝对是比其他使用 view.center 的解决方案更通用的解决方案
  • 如果你有一个视图控制器在导航栏下有它的视图,而另一个没有
  • 审查中有一个编辑,试图用新方法更改您的原始答案。我觉得这是一个有用的附录,所以它被添加到 Swift 5.0 的更新代码中。如果您认为它没有帮助,请查看并回滚到原始答案。
【解决方案2】:

斯威夫特 3:

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

或者你可以试试:

activityIndicator.center = view.center

【讨论】:

  • 如果 activityIndi​​cator 不是 view 的子节点并且 view 不在 0;0 处,则它不是中心。
【解决方案3】:

center 属性与视图的父视图相关。所以如果你的视图框架是{10, 10, 20, 20}center 就是{20, 20}

我猜你想在view 中居中activityIndicator

你可以的

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

【讨论】:

  • 我已经尝试过了,不幸的是它位于超级视图的右下角:(
  • 如何 {20, 20 } ?你能解释一下吗
  • @saurabhgoyal795 中心是原点加上一半大小。
猜你喜欢
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
相关资源
最近更新 更多