Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-如何在同一位置显示UIActivityIndicator视图而不向右移动?_Ios_Swift_Uibarbuttonitem_Uiactivityindicatorview_Ibaction - Fatal编程技术网

Ios Swift-如何在同一位置显示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)

我试图在它所取代的UIBarbuttonite的同一位置显示UIActivityIndicator视图。它在设置动画时向右移动。如何在不更改样式的情况下将其居中

代码如下:

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

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

  • iPhone vs iPad
  • 肖像与风景
  • iOS的不同版本

  • 您应该在所有想要支持的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
    可能会根据以下因素发生变化-

  • iPhone vs iPad
  • 肖像与风景
  • iOS的不同版本

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

    非常感谢您提供的详细答案。我尝试了代码并检查了所有因素,但问题仍然是一样的。非常感谢你的详细回答。我尝试了代码并检查了所有因素,但问题仍然是一样的。