在 Swift 中获取任何 UIView 的中心
Get center of any UIView in Swift
我正在尝试编写一个全局函数,通过调用此类函数将 activityIndicator 添加到任何视图(不过主要是 imageViews)。
我现在拥有的功能是:
public func addActivityIndicatorToView(activityIndicator: UIActivityIndicatorView, view: UIView){
//activityIndicator configuration ...
activityIndicator.center = view.center
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
}
但是由于某种原因我没有看到视图的中心。
我也尝试过围绕 SO 和 Google 的各种解决方案,但 none 一直有效到现在。
有什么方法可以获取中心点并将activityIndicator设置为任何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
我正在尝试编写一个全局函数,通过调用此类函数将 activityIndicator 添加到任何视图(不过主要是 imageViews)。
我现在拥有的功能是:
public func addActivityIndicatorToView(activityIndicator: UIActivityIndicatorView, view: UIView){
//activityIndicator configuration ...
activityIndicator.center = view.center
view.addSubview(activityIndicator)
activityIndicator.startAnimating()
}
但是由于某种原因我没有看到视图的中心。
我也尝试过围绕 SO 和 Google 的各种解决方案,但 none 一直有效到现在。
有什么方法可以获取中心点并将activityIndicator设置为任何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