Swift - 如何在不向右移动的情况下在同一位置显示 UIActivityIndi​​catorView?

问题描述

我试图在它替换的 UIBarButtonItem 的同一位置显示一个 UIActivityIndi​​catorView。它在动画时向右移动。如何在不改变样式的情况下将其居中?

代码如下:

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

图标大小为 UIBarButtonItem24x24 最终成为 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 可能会根据以下因素发生变化 -

  1. iPhone 与 iPad
  2. 纵向与横向
  3. 不同版本的 iOS

您应该在要支持的所有 iOS 版本上进行检查,并在以后发布的每个新 iOS 版本中再次测试。