Ios Swift-如何在同一位置显示UIActivityIndicator视图而不向右移动?
我试图在它所取代的UIBarbuttonite的同一位置显示UIActivityIndicator视图。它在设置动画时向右移动。如何在不更改样式的情况下将其居中 代码如下:Ios Swift-如何在同一位置显示UIActivityIndicator视图而不向右移动?,ios,swift,uibarbuttonitem,uiactivityindicatorview,ibaction,Ios,Swift,Uibarbuttonitem,Uiactivityindicatorview,Ibaction,我试图在它所取代的UIBarbuttonite的同一位置显示UIActivityIndicator视图。它在设置动画时向右移动。如何在不更改样式的情况下将其居中 代码如下: @IBAction func upload(_ sender: Any) { let item = sender as! UIBarButtonItem let indicatorView = UIActivityIndicatorView(style: .medium)
@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
}
}
}
我将创建一个自定义
ui视图
,其中包含条形按钮项的文本/图标和活动指示器,所有这些都设置了约束,当我需要加载/动画时,我将直接在该自定义视图上加载/动画,并相应地隐藏/显示元素。UIBarButtonItem
用该自定义视图初始化。我将创建一个自定义的UIView
,其中包含条形按钮项和活动指示器的文本/图标,所有这些都设置了约束,当我需要加载/设置动画时,我会直接在自定义视图上加载/设置动画,并相应地隐藏/显示元素。UIBarButtonItem用该自定义视图初始化。观察-iPhone SE(iOS 14.6)
图标大小为say24x24
的UIBarButtonItem
最终在UINavigationBar
中显示为43x44
UIActivityIndicatorView(样式:.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
可能会根据以下因素发生变化-
您应该在所有想要支持的iOS版本上检查此项,并在以后发布的每个新iOS版本中再次测试。观察-iPhone SE(iOS 14.6) 图标大小为say
24x24
的UIBarButtonItem
最终在UINavigationBar
中显示为43x44
UIActivityIndicatorView(样式:.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
可能会根据以下因素发生变化-
您应该在所有想要支持的iOS版本上检查此项,并在以后发布的每个新iOS版本中再次测试。非常感谢您提供的详细答案。我尝试了代码并检查了所有因素,但问题仍然是一样的。非常感谢你的详细回答。我尝试了代码并检查了所有因素,但问题仍然是一样的。