用UIActivityIndi​​catorView替换UIBarButtonItem

Luc*_*uca 40 iphone objective-c

我想UIBarButtonItem用a 替换我的(用于刷新)UIActivityIndicatorView,当刷新完成后,我想转回刷新按钮并删除UIActivityIndicatorView.

Tom*_*ing 50

只需创建两个不同的UIBarButtonItems

一个用于活动指示符,另一个用于正常的UIBarButtonItem.

UIActivityIndicatorView * activityView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 25, 25)];
[activityView sizeToFit];
[activityView setAutoresizingMask:(UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)];
UIBarButtonItem *loadingView = [[UIBarButtonItem alloc] initWithCustomView:activityView];
[self.navigationItem setRightBarButtonItem:loadingView];
[loadingView release];
[activityView release];

UIBarButtonItem * normalButton = [[UIBarButtonItem alloc] initWithTitle...];
[self.navigationItem setRightBarButtonItem:normalButton];
[normalButton release];
Run Code Online (Sandbox Code Playgroud)

如果要切换它们,只需将其重新分配rightBarButtonItem给任何一个.

  • 我不得不添加`[activityView startAnimating];`也. (8认同)

Nas*_*uig 10

这对我有用:

- (void) rightItemButtonWithActivityIndicator
{
    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
    [activityIndicator startAnimating];
    UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicator];
    [activityIndicator release];
    self.navigationItem.rightBarButtonItem = activityItem;
    [activityItem release];
}
Run Code Online (Sandbox Code Playgroud)


rba*_*win 9

使用Swift 4 Xcode 9时,我需要在进行网络操作时暂时将Refresh替换为BarButtonItem一个ActivityIndicator,然后重新启用该按钮。这是我的解决方案:

class ViewController: UIViewController {

    var activityIndicator = UIActivityIndicatorView()
    var refreshBarButton = UIBarButtonItem()
    var activityBarButton = UIBarButtonItem()

    override func viewDidLoad() {
        super.viewDidLoad()

        activityIndicator.sizeToFit()
        activityIndicator.color = self.view.tintColor

        activityBarButton = UIBarButtonItem.init(customView: activityIndicator)
        refreshBarButton = UIBarButtonItem(barButtonSystemItem: .refresh, target: self, action: #selector(refreshBarButtonPressed))

        showRefreshButton()
    }

    func performNetworkOperation(completion: @escaping(Bool)->()) {
        //simulate network operation
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(3), execute: {
        completion(true)
        })
    }

    @objc func refreshBarButtonPressed() {

        showActivityIndicator()
        activityIndicator.startAnimating()

        performNetworkOperation { (result) in
            //completion
            self.activityIndicator.stopAnimating()
            self.showRefreshButton()
        }
    }

    func showRefreshButton() {
        self.navigationItem.setRightBarButton(refreshBarButton, animated: true)
    }

    func showActivityIndicator() {
        self.navigationItem.setRightBarButton(activityBarButton, animated: true)
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


小智 7

我试图做同样的事情,我认为设置self.navigationItem.rightBarButtonItem不起作用,因为活动指示器不会显示.事实证明它工作正常,我只是看不到它,因为我有一个白色导航栏,默认的UIActivityIndi​​catorView样式也是白色.所以它在那里,但看不见.灰色风格我现在可以看到它.

    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
Run Code Online (Sandbox Code Playgroud)

(杜).