在 UIButton 中添加 UIActivityIndi​​catorView

Posted

技术标签:

【中文标题】在 UIButton 中添加 UIActivityIndi​​catorView【英文标题】:Adding UIActivityIndicatorView in a UIButton 【发布时间】:2014-07-13 03:30:52 【问题描述】:

我在这里阅读了有关在 UIButton 中添加 UIActivtyIndi​​catorView 的各种帖子,但到目前为止,这些帖子都没有帮助我。

我有一个表格视图,其中每个单元格中都有按钮,上面写着“开始”。 当用户单击一个按钮时,我希望该按钮显示一个 UIActivtyIndi​​catorView,直到完成所有背景内容。这里我使用一些解析方法在后台保存用户信息。

我有一个方法

- (void)going:(UIButton *)button 

    NSLog(@"going button pressed");

    //Added this code
    UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc]initWithFrame:button.bounds];
    [button addSubview:activity];
    [activity startAnimating];

    if ([button.titleLabel.text isEqualToString:@"Go"])  // Select
     ....
     // Just code changing user info

        [PFObject saveAllInBackground:save block:^(BOOL success, NSError *error) 

            if (success) 

                //Do more stuff so save user info in background
            
        ];
    
    else  // Deselect

        //More stuff
            if (success) 

                //Toggle button
                [defaults setObject:@"" forKey:@"currentBarID"];
                [defaults synchronize];
                selectedGoingToButton = nil;
                [self deselectGoingButton:button];
                [self reloadData];
            
        ];
    

- (void)selectGoingButton:(UIButton *)button 



    NSLog(@"GoingButtonselected");
    [button setTitle:@"Going" forState:UIControlStateNormal];
    button.layer.borderColor = neonBlue.CGColor;
    [button setNeedsDisplay];

如您所见,这两种方法是我将按钮从纯色切换到突出显示颜色的地方,但在按钮突出显示之前,我希望显示 UIActivityIndi​​catorView。

目前它不显示,并且按钮只是切换颜色而不显示 ActivtyIndi​​cator。

感谢任何帮助。谢谢!

编辑:更改了 UIActivityView 初始化行,以便我现在传入 button.bounds 属性。

ActivtyIndi​​catorView 现在正在显示,但现在我的问题是重新加载圆圈显示在“GO”按钮标题下,然后在标题更改时停止。我希望它在显示 ActivityIndi​​cator 时按钮标题消失。有什么建议吗?

【问题讨论】:

活动视图的框架需要相对于按钮。你的按钮宽度真的超过 300 点吗? 我明白了,如何从参数中传递的按钮中获取框架? @rmaddy 使用bounds 属性。 好的,谢谢。我进行了编辑。现在我有另一个我正在努力解决的问题。 @rmaddy UIActivityIndicatorView inside UIButton的可能重复 【参考方案1】:
- (void)selectGoingButton:(UIButton *)button 


    activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(25, 25, 50, 50)];
    activityIndicator.backgroundColor = [UIColor clearColor];
    [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];
    [activityIndicator startAnimating];
    [yourview addSubview:activityIndicator];


    NSLog(@"GoingButtonselected");
   [button setTitle:@"Going" forState:UIControlStateNormal];
    button.layer.borderColor = neonBlue.CGColor;
   [button setNeedsDisplay];








- (void)going:(UIButton *)button 


    NSLog(@"going button pressed");

    //Added this code
//UIActivityIndicatorView *activity = [[UIActivityIndicatorView alloc]initWithFrame:button.bounds];
//[button addSubview:activity];
//[activity startAnimating];

   if ([button.titleLabel.text isEqualToString:@"Go"])  // Select
   ....
   // Just code changing user info

       [PFObject saveAllInBackground:save block:^(BOOL success, NSError *error) 

           if (success) 

               //Do more stuff so save user info in background
           
       ];
   
   else  // Deselect

       //More stuff
           if (success) 

               //Toggle button
               [defaults setObject:@"" forKey:@"currentBarID"];
               [defaults synchronize];
               selectedGoingToButton = nil;
               [self deselectGoingButton:button];
               [self reloadData];
           
       ];
   

[activityIndicator stopAnimating];
[activityIndicator removeFromSuperview];
activityIndicator = nil;

希望对你有所帮助。

【讨论】:

谢谢,但是这个解决方案仍然没有将activityIndi​​cator放在按钮的停止视图上方。出于某种原因,我仍然看到按钮的标题,并且指示器只是悬停在它上面。指示器不覆盖标题层。 我认为你需要让你的指标更大?对?我刚刚给了我的尺码(50,50),如果你想要更大的,可以改一下。【参考方案2】:

为什么要经历这么多麻烦并尝试将UIActivityIndicatorView 嵌入到另一个 Cocoa 视图中,例如 UIButtonUITextView 或其他。

为什么不把你的UIActivityIndicatorView 像这样放在上面呢?这保证有效。

UIActivityIndicatorView * spin = [[UIActivityIndicatorView alloc]
    initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
spin.center = myButton.center;
[myButton.superview insertSubview:spin aboveSubview:myButton];
[spin startAnimating];

【讨论】:

我仍然有这个实现的问题,指标没有覆盖它下面的按钮。按钮上仍然显示“GO”,只是发生了旋转。我可以看到机器人的“GO”和指示器的旋转,我只想能够看到微调器。 更改按钮透明度 @milesper:考虑到前向兼容性、自动布局约束等,我会将UIButtonUIActivityIndicatorView 放在一个共同的超级视图中,我将在上面应用布局和alpha。

以上是关于在 UIButton 中添加 UIActivityIndi​​catorView的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UIActivity 控制器中删除“添加到 iCloud Drive”?

iOS 8 自定义 UIActivity 图片黑色背景色

自定义 UIActivity :图像图标反转颜色

具有内置邮件外观的自定义 UIActivity

UIActivity 和 AVAsset 数据类型使用

(iOS 6) 从 UIActivityViewController 外部使用 UIActivity 的自定义子类