UIButton和UIControlEventState问题

typ*_*ror 3 iphone objective-c button

我的iPhone应用程序中有一个非常具体的"错误".我正在为按钮的突出显示和正常状态设置两个图像.当你"按下"然后以慢速"触摸"时它按预期工作,但如果你快速点击/点击它,状态之间会有明显的闪烁.这是一个已知的错误还是我错误地设置状态?

这是创建按钮的代码:

UIImage *normalImage = [[UIImage imageNamed:@"btn-small.png"] stretchableImageWithLeftCapWidth:10.0f topCapHeight:0.0f];
UIImage *highlightedImage = [[UIImage imageNamed:@"btn-small-down.png"] stretchableImageWithLeftCapWidth:10.0f topCapHeight:0.0f];

[self setBackgroundColor:[UIColor clearColor]];

[self setBackgroundImage:normalImage forState:UIControlStateNormal];
[self setBackgroundImage:highlightedImage forState:UIControlStateDisabled];
[self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted];

[self setAdjustsImageWhenDisabled:FALSE];
[self setAdjustsImageWhenHighlighted:FALSE];
Run Code Online (Sandbox Code Playgroud)

当点击一个按钮时,它只是禁用自己并启用另一个按钮:

- (IBAction)aboutButtonTouched:(id)sender
{
    aboutButton.enabled = FALSE;
    rulesButton.enabled = TRUE;
}

- (IBAction)rulesButtonTouched:(id)sender
{
    rulesButton.enabled = FALSE;
    aboutButton.enabled = TRUE;
}
Run Code Online (Sandbox Code Playgroud)

有关此快速点击闪烁的任何想法?

typ*_*ror 8

好的,我解决了这个问题.采取了一些逆向工程,我试图做的,但我想我会发布我所做的,以防它帮助其他人.

我做的第一件事是修改aboutButtonTouched方法来记录按钮的state属性,这是一个位掩码NSUInteger:

- (IBAction)aboutButtonTouched:(id)sender
{
    rulesButton.enabled = TRUE;
    [sender setEnabled:FALSE];    

    NSLog(@"%d", [sender state]);
}
Run Code Online (Sandbox Code Playgroud)

此时,通过setEnabled禁用该按钮,并且日志报告状态为"3".查看UIControlState的位掩码类型:

enum {
   UIControlStateNormal               = 0,            // 0
   UIControlStateHighlighted          = 1 << 0,       // 1
   UIControlStateDisabled             = 1 << 1,       // 2
   UIControlStateSelected             = 1 << 2,       // 4
   UIControlStateApplication          = 0x00FF0000,
   UIControlStateReserved             = 0xFF000000
};
Run Code Online (Sandbox Code Playgroud)

(注释添加,因为我永远不记得按位).我们可以看到,为了获得"3"(0011),我们应该使用UIControlStateHighlighted | UIControlStateDisabled(0001 | 0010或1 | 2),这是我在原始按钮定义中没有作为状态的东西.这里的关键是,在状态刚刚被禁用之前有一个短暂的时间("控制在跟踪期间触摸进入和退出时进入此状态,并且当有触摸时" - 来自文档).因此,按钮不闪烁的最终状态设置是:

[self setBackgroundImage:normalImage forState:UIControlStateNormal];
[self setBackgroundImage:highlightedImage forState:UIControlStateDisabled];
[self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted];
[self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted|UIControlStateDisabled];
Run Code Online (Sandbox Code Playgroud)