【问题标题】:How can I create a button with a UIActivityIndicator in my navigation bar with the same style as normal buttons?如何在导航栏中使用与普通按钮相同的样式创建带有 UIActivityIndi​​cator 的按钮?
【发布时间】:2010-03-11 07:45:37
【问题描述】:

我在这里和其他网站上看到的所有示例都涉及创建 UIActivityIndi​​catorView 并使用以下内容加载它:

self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] 
                   initWithCustomView:myActivityIndicatorView 
                   target:nil 
                   action:nil] 
                  autorelease];

但是,这只是在导航栏中创建了一个简单的活动指示器。我想要做的是有一个按钮,看起来就像普通的 UIBarButtonSystemItem 按钮,但有一个活动指示器而不是默认图像之一。我尝试使用 nil 图像或标题执行 initWithImage 和 initWithTitle,然后将活动指示器添加为子视图,但这不起作用。

有什么想法吗?

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    我的解决方案是创建 UIButton 的子类:

    SOActivityButton.h中:

    @interface SOActivityButton : UIButton 
    {
    UIActivityIndicatorView* activityIndicator;
    }
    @end
    

    SOActivityButton.m中:

    @implementation SOActivityButton
    
    - (id)initWithFrame:(CGRect)frame 
    {
        if (self = [super initWithFrame:frame]) 
        {
            CGRect innerFrame = CGRectInset(frame, 8.0f, 8.0f);
            activityIndicator = [[UIActivityIndicatorView alloc]
                                        initWithFrame:innerFrame];
            activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
            [self addSubview:activityIndicator];
        }
        return self;
    }
    
    - (void)dealloc 
    {
        [activityIndicator release], activityIndicator = nil;
        [super dealloc];
    }
    
    - (void) startAnimating
    {   
        [activityIndicator startAnimating];
    }
    
    - (void) stopAnimating
    {   
        [activityIndicator stopAnimating];
    }
    @end
    

    然后使用它:

    SOActivityButton* activityButton = [[SOActivityButton alloc] 
                        initWithFrame:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
    [activityButton setImage:[UIImage imageNamed:@"button-background.png"]
                        forState:UIControlStateNormal];
    [activityButton addTarget:self action:@selector(myAction:) 
                        forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *activityBarButtonItem = [[UIBarButtonItem alloc] 
                        initWithCustomView:activityButton];
    [activityButton release];
    self.navigationItem.rightBarButtonItem = activityBarButtonItem;
    [activityBarButtonItem release];
    

    您需要找到或创建一个button-background.png。 PSD here 应该有一个。

    【讨论】:

    • 嗯,UIBarButtonItem 不是 UIButton,因此在这种情况下,您的“子类”方法应该更多地直接应用于 UIBarButtonItem。
    • 并非如此,因为 UIBarButtonItem 无法让您轻松访问它的视图层次结构。你仍然需要创建自己的视图来替换 UIBarButtonItem 的 customView,子类化 UIBarButtonItem 并没有多大意义。
    • 这令人遗憾,它没有被接受为答案。谢谢
    • 很棒的代码,但是在 UIButton 上方添加 UIActivityIndi​​cator 会阻止按钮获得“点击”。您应该设置activityIndicator.userInteractionEnabled = NO;,如下所示:stackoverflow.com/questions/8124301/…。但也许在写这个答案的时候不是这样的。我留下此评论以供参考。
    【解决方案2】:

    您是否尝试过在按钮栏中创建一个 UIButton,然后添加一个活动指示器作为 UIButton 的子视图?

    【讨论】:

      【解决方案3】:

      我有这个工作,它很简单。只需使用 IB 将活动指示器放在您想要的位置,但确保它在列表中低于您想要的栏,并且位于“顶层”(不是其他任何东西的子视图)。然后通过插座在代码中控制它。

      【讨论】:

        【解决方案4】:

        这里有一些帮助:

        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];
        [activityIndicator startAnimating];
        

        【讨论】:

        • 2次[activityIndi​​cator startAnimating];
        猜你喜欢
        • 1970-01-01
        • 2012-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多