【问题标题】:Activity indicator at the centre of Navigation Bar导航栏中心的活动指示器
【发布时间】:2013-04-17 09:56:29
【问题描述】:

在我的应用程序中,我想在导航栏的中心添加活动指示器(标题位置)。当网络服务响应完成时,它应该替换为旧标题。我的应用程序中有 5 个导航栏。当我在谷歌中搜索时,我有几个代码,但他们只是改变左栏或右栏按钮。有帮助吗?

【问题讨论】:

    标签: ios xcode uinavigationcontroller uinavigationbar


    【解决方案1】:

    您使用导航项的 titleView 属性来替换导航栏的标题。所以要添加一个活动指示器,只需这样做:

        UIActivityIndicatorView *aiView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        aiView.hidesWhenStopped = NO; //I added this just so I could see it
        self.navigationItem.titleView = aiView;
    

    当您想删除它并再次显示标题时:

        self.navigationItem.titleView = nil;
    

    【讨论】:

    • 有没有办法让活动指示器显示“正在连接”之类的文本?
    • @roi.holtzman,我认为这应该是可能的。您需要创建一个 UIView 作为 navigationItem 的 titleView,并给它两个子视图;一个活动指示器和一个标签。
    【解决方案2】:

    pasqls 答案对我来说效果很好,我已经用 swift 编写了它

        func showActivityIndicator() {
            let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.White)
            activityIndicatorView.frame = CGRectMake(0, 0, 14, 14)
            activityIndicatorView.color = UIColor.blackColor()
            activityIndicatorView.startAnimating()
    
            let titleLabel = UILabel.new()
            titleLabel.text = "...Connecting"
            titleLabel.font = UIFont.italicSystemFontOfSize(14)
    
            let fittingSize = titleLabel.sizeThatFits(CGSizeMake(200.0, activityIndicatorView.frame.size.height))
            titleLabel.frame = CGRectMake(activityIndicatorView.frame.origin.x + activityIndicatorView.frame.size.width + 8, activityIndicatorView.frame.origin.y, fittingSize.width, fittingSize.height)
    
            let titleView = UIView(frame: CGRectMake(((activityIndicatorView.frame.size.width + 8 + titleLabel.frame.size.width) / 2), ((activityIndicatorView.frame.size.height) / 2), (activityIndicatorView.frame.size.width + 8 + titleLabel.frame.size.width), (activityIndicatorView.frame.size.height)))
            titleView.addSubview(activityIndicatorView)
            titleView.addSubview(titleLabel)
    
            self.navigationItem.titleView = titleView
        }
    
        func hideActivityIndicator() {
            self.navigationItem.titleView = nil
        }
    

    【讨论】:

    • 最好写一些关于你的答案的解释。
    • 有时很难快速找到答案!谢谢
    【解决方案3】:

    此外,如果您想在活动指示器旁边添加一个文本标签(如 Apple 在设置应用程序中所做的那样,例如 Facebook 登录),您可以这样做:

    - (void)showActivityIndicator
    {
        UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        activityIndicatorView.frame = CGRectMake(0, 0, 22, 22);
        activityIndicatorView.color = [UIColor blackColor];
        [activityIndicatorView startAnimating];
    
        UILabel *titleLabel = [UILabel new];
        titleLabel.text = @"Creating Account";
        titleLabel.font = [UIFont boldFlatFontOfSize:18];
    
        CGSize fittingSize = [titleLabel sizeThatFits:CGSizeMake(200.0f, activityIndicatorView.frame.size.height)];
        titleLabel.frame = CGRectMake(activityIndicatorView.frame.origin.x + activityIndicatorView.frame.size.width + 8,
                                      activityIndicatorView.frame.origin.y,
                                      fittingSize.width,
                                      fittingSize.height);
    
        UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(-(activityIndicatorView.frame.size.width + 8 + titleLabel.frame.size.width)/2,
                                                                     -(activityIndicatorView.frame.size.height)/2,
                                                                     activityIndicatorView.frame.size.width + 8 + titleLabel.frame.size.width,
                                                                     activityIndicatorView.frame.size.height)];
        [titleView addSubview:activityIndicatorView];
        [titleView addSubview:titleLabel];
    
        self.navigationItem.titleView = titleView;
    }
    
    - (void)hideActivityIndicator
    {
        self.navigationItem.titleView = nil;
    }
    

    【讨论】:

      【解决方案4】:

      斯威夫特 4

      pasql

      private func showActivityIndicator() {
          let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .white)
          activityIndicatorView.frame = CGRect(x: 0, y: 0, width: 14, height: 14)
          activityIndicatorView.color = .black
          activityIndicatorView.startAnimating()
      
          let titleLabel = UILabel()
          titleLabel.text = "...Connecting"
          titleLabel.font = UIFont.italicSystemFont(ofSize: 14)
      
          let fittingSize = titleLabel.sizeThatFits(CGSize(width: 200.0, height: activityIndicatorView.frame.size.height))
          titleLabel.frame = CGRect(x: activityIndicatorView.frame.origin.x + activityIndicatorView.frame.size.width + 8,
                                    y: activityIndicatorView.frame.origin.y,
                                    width: fittingSize.width,
                                    height: fittingSize.height)
      
          let rect = CGRect(x: (activityIndicatorView.frame.size.width + 8 + titleLabel.frame.size.width) / 2,
                            y: (activityIndicatorView.frame.size.height) / 2,
                            width: activityIndicatorView.frame.size.width + 8 + titleLabel.frame.size.width,
                            height: activityIndicatorView.frame.size.height)
          let titleView = UIView(frame: rect)
          titleView.addSubview(activityIndicatorView)
          titleView.addSubview(titleLabel)
      
          navigationItem.titleView = titleView
      }
      
      private func hideActivityIndicator() {
          navigationItem.titleView = nil
      }
      

      【讨论】:

      • 感谢升级代码。我们总是会得到新的变化,但没关系。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多