问题描述
我试图在它替换的 UIBarButtonItem 的同一位置显示一个 UIActivityIndicatorView。它在动画时向右移动。如何在不改变样式的情况下将其居中?
代码如下:
@IBAction func upload(_ sender: Any) {
let item = sender as! UIBarButtonItem
let indicatorView = UIActivityIndicatorView(style: .medium)
indicatorView.translatesAutoresizingMaskIntoConstraints = false
item.customView = indicatorView
indicatorView.startAnimating()
dispatchQueue.global().async {
Thread.sleep(forTimeInterval: 5)
dispatchQueue.main.async {
item.customView = nil
}
}
}
解决方法
我将创建一个自定义 UIView
,其中包含条形按钮项和活动指示器的文本/图标,所有这些都设置了约束,并且在我需要时加载/动画与否我会这样做直接在该自定义视图上并相应地隐藏/显示元素。 UIBarButtonItem
使用该自定义视图进行初始化。
观察 - iPhone SE (iOS 14.6)
图标大小为 UIBarButtonItem
的 24x24
最终成为 43x44
中的 UINavigationBar
。
UIActivityIndicatorView(style: .medium)
的大小为 20x20
。
您可以创建一个容器 UIView
实例来包装 UIActivityIndicatorView
以提供必要的水平填充并将此容器提供给 UIBarButtonItem.customView
。
代码
@IBAction func upload(_ sender: Any) {
let item = sender as! UIBarButtonItem
let containerView = UIView(frame: .zero)
containerView.translatesAutoresizingMaskIntoConstraints = false
let indicatorView = UIActivityIndicatorView(style: .medium)
indicatorView.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(indicatorView)
NSLayoutConstraint.activate([
containerView.widthAnchor.constraint(equalToConstant: 43),containerView.heightAnchor.constraint(equalToConstant: 44),indicatorView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor,constant: -8),indicatorView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor),])
item.customView = containerView
indicatorView.startAnimating()
DispatchQueue.global().async {
Thread.sleep(forTimeInterval: 5)
DispatchQueue.main.async {
item.customView = nil
}
}
}
请注意,这些尺寸值 43x44
和右填充 8
可能会根据以下因素发生变化 -
- iPhone 与 iPad
- 纵向与横向
- 不同版本的 iOS
您应该在要支持的所有 iOS 版本上进行检查,并在以后发布的每个新 iOS 版本中再次测试。