首页 文章

触摸后保持选择UIButton

提问于
浏览
88

在我的用户单击按钮后,我希望该按钮在执行网络操作期间保持推送状态 . 网络操作完成后,我希望按钮返回其默认状态 .

我尝试在按下按钮后调用-- [UIButton setSelected:YES] (在我的网络操作完成后相应调用-- [UIButton setSelected:NO] ),但似乎没有做任何事情 . 如果我打电话给 setHighlighted: 也一样 .

我想我可以尝试交换背景图像,以表示网络操作期间的选定状态,但这似乎是一个黑客 . 有更好的建议吗?

这是我的代码的样子:

- (IBAction)checkInButtonPushed
{
    self.checkInButton.enabled = NO;
    self.checkInButton.selected = YES;
    self.checkInButton.highlighted = YES;
    [self.checkInActivityIndicatorView startAnimating];
    [CheckInOperation startWithPlace:self.place delegate:self];
}

- (void)checkInCompletedWithNewFeedItem:(FeedItem*)newFeedItem wasNewPlace:(BOOL)newPlace possibleError:(NSError*)error;
{
    [self.checkInActivityIndicatorView stopAnimating];
    self.checkInButton.enabled = YES;
    self.checkInButton.selected = NO;
    self.checkInButton.highlighted = NO;
}

9 回答

  • 0

    如何为按钮上的不同 UIControlStates 设置图像?您是否为 UIControlStateHighlighted 以及 UIControlStateSelected 设置了背景图片?

    UIImage *someImage = [UIImage imageNamed:@"SomeResource.png"];
    [button setBackgroundImage:someImage forState:UIControlStateHighlighted];
    [button setBackgroundImage:someImage forState:UIControlStateSelected];
    

    如果您在按钮触摸事件而不是在内部触摸上设置选定状态,则您的按钮实际上将处于突出显示的选定状态,因此您也需要设置该状态 .

    [button setBackgroundImage:someImage forState:(UIControlStateHighlighted|UIControlStateSelected)];
    

    编辑:

    总结我在评论中的评论并解决您发布的代码...您需要为您所在的完整 UIControl 状态设置背景图像 . 根据您的代码片段,此控件状态将被禁用选中突出显示在网络运行期间 . 这意味着您需要这样做:

    [button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateHighlighted|UIControlStateSelected)];
    

    如果你删除 highlighted = YES ,那么你需要这个:

    [button setBackgroundImage:someImage forState:(UIControlStateDisabled|UIControlStateSelected)];
    

    得到图片?

  • 8

    我有一个更简单的方法 . 只需使用带有0延迟的"performSelector"来执行 [button setHighlighted:YES] . 这将在当前runloop结束后执行重新突出显示 .

    - (IBAction)buttonSelected:(UIButton*)sender {
        NSLog(@"selected %@",sender.titleLabel.text);
        [self performSelector:@selector(doHighlight:) withObject:sender afterDelay:0];
    }
    
    - (void)doHighlight:(UIButton*)b {
        [b setHighlighted:YES];
    }
    
  • 2

    “打开电源后一切都会变得更好”

    button.selected = !button.selected;
    

    在将插座连接到Interface Builder中的按钮后,工作完美 .

    您不需要setBackgroundImage:forState:,构建器允许您指定背景(必要时调整大小)或/和前景(不调整大小)图像 .

  • 73

    尝试使用NSOperationQueue来实现这一目标 . 尝试如下代码:

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        theButton.highlighted = YES;
    }];
    

    希望这可以帮助 .

  • 0

    使用块,这样您就不必构建一个完整的单独方法:

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0), dispatch_get_main_queue(), ^{
        theButton.highlighted = YES;
    });
    

    更新

    为了清楚起见,你仍然需要为组合状态设置背景(或正常图像),以及在接受的答案中像sbrocket那样的常规状态 . 在某些时候,您的按钮将被选中并突出显示,除非您执行以下操作,否则您将无法获得该图像:

    [button setBackgroundImage:someImage forState (UIControlStateHighlighted|UIControlStateSelected)];
    

    否则,您的按钮可以回退到UIControlStateNormal图像以获得短暂选择的突出显示状态,您将看到闪光灯 .

  • 27

    在swift中,我正如以下那样做 .

    我创建一个 UIButton 的子类并实现了一个自定义属性 state

    class ActiveButton: UIButton {
    
        private var _active = false
        var active:Bool {
            set{
                _active = newValue
                updateState()
            }
            get{
                return _active
            }
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            self.addTarget(self, action: #selector(ActiveButton.touchUpInside(_:)), forControlEvents: .TouchUpInside)
        }
    
        func touchUpInside(sender:UIButton) {
            active = !active
        }
    
        private func updateState() {
            NSOperationQueue.mainQueue().addOperationWithBlock {
                self.highlighted = self.active
            }
        }
    
    }
    

    适合我 .

  • 29

    我有一个类似的问题,我想要一个按钮,点击后保持它的高亮 . 问题是,如果您尝试在单击操作中使用 setHighlighted:YES ,它将在您单击操作后立即重置, - (IBAction)checkInButtonPushed

    我通过使用像这样的NSTimer来解决这个问题

    NSTimer *timer;
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.01
                                             target: self
                                           selector: @selector(selectCurrentIndex)
                                           userInfo: nil
                                            repeats: NO];
    

    然后从我的 selectCurrentIndex 方法中调用 setHighlighted:YES . 我使用常规 UIButtonTypeRoundedRect 按钮 .

  • 27

    我有另一种方式...如果你不想使用图像,并且你想要按下按钮的效果,你可以继承按钮,这里是我的代码:

    在.h文件中:

    @interface reservasButton : UIButton {
    
    BOOL isPressed;
    }
     @end
    

    在.m文件中:

    #import <QuartzCore/QuartzCore.h>
    
    
     @implementation reservasButton
    
     -(void)setupView {  //This is for Shadow
    
        self.layer.shadowColor = [UIColor blackColor].CGColor;
        self.layer.shadowOpacity = 0.5; 
        self.layer.shadowRadius = 1;    
        self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f); //comment
        //   self.layer.borderWidth = 1;
        self.contentVerticalAlignment   = UIControlContentVerticalAlignmentCenter;
        self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
    
        // [self setBackgroundColor:[UIColor whiteColor]];
    
        //  self.opaque = YES;
    
    
    }
    
    -(id)initWithFrame:(CGRect)frame{
        if((self = [super initWithFrame:frame])){
            [self setupView];
        }
    
        return self;
    }
    
    -(id)initWithCoder:(NSCoder *)aDecoder{
        if((self = [super initWithCoder:aDecoder])){
            [self setupView];
        }
    
        return self;
    }
    
    //Here is the important code
    
     -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    
    
      if (isPressed == FALSE) {
    
          self.contentEdgeInsets = UIEdgeInsetsMake(1.0,1.0,-1.0,-1.0);
          self.layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
          self.layer.shadowOpacity = 0.8;
    
          [super touchesBegan:touches withEvent:event];
    
          isPressed = TRUE;
    
         }
         else {
    
             self.contentEdgeInsets = UIEdgeInsetsMake(0.0,0.0,0.0,0.0);
             self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f);
             self.layer.shadowOpacity = 0.5;
    
             [super touchesEnded:touches withEvent:event];
    
             isPressed = FALSE;
    
         }
    
    
     } `
    
  • 1

    这是使用上述方法的C#/ MonoTouch(Xamarin.iOS)实现 . 它假定您已经设置了突出显示的图像状态,并配置选定和选中的突出显示状态以使用相同的图像 .

    var selected = button.BackgroundImageForState(UIControlState.Highlighted);
    button.SetBackgroundImage(selected, UIControlState.Selected);
    button.SetBackgroundImage(selected, UIControlState.Selected | UIControlState.Highlighted);
    button.TouchUpInside += delegate
    {
        NSTimer.CreateScheduledTimer(TimeSpan.FromMilliseconds(0), delegate
        {
            button.Highlighted = true;
            NSTimer.CreateScheduledTimer(TimeSpan.FromMilliseconds(200), delegate
            {
                button.Highlighted = false;
            });
        });
    };
    

相关问题