Iphone UIButton和UIControlEventState问题
我的iPhone应用程序中有一个非常特殊的“bug”。我正在为按钮的突出显示和正常状态设置两个图像。当你以缓慢的速度“按下”然后“触摸”时,它会像预期的那样工作,但是如果你快速点击它,状态之间会有明显的闪烁。这是一个已知的错误还是我设置的状态不正确 以下是创建按钮的代码:Iphone UIButton和UIControlEventState问题,iphone,objective-c,button,Iphone,Objective C,Button,我的iPhone应用程序中有一个非常特殊的“bug”。我正在为按钮的突出显示和正常状态设置两个图像。当你以缓慢的速度“按下”然后“触摸”时,它会像预期的那样工作,但是如果你快速点击它,状态之间会有明显的闪烁。这是一个已知的错误还是我设置的状态不正确 以下是创建按钮的代码: UIImage *normalImage = [[UIImage imageNamed:@"btn-small.png"] stretchableImageWithLeftCapWidth:10.0f topCapHeight
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];
当点击一个按钮时,它会自动禁用并启用另一个按钮:
- (IBAction)aboutButtonTouched:(id)sender
{
aboutButton.enabled = FALSE;
rulesButton.enabled = TRUE;
}
- (IBAction)rulesButtonTouched:(id)sender
{
rulesButton.enabled = FALSE;
aboutButton.enabled = TRUE;
}
您对这种快速点击闪烁有什么想法吗?也许您应该颠倒更改按钮的顺序
- (IBAction)aboutButtonTouched:(id)sender
{
rulesButton.enabled = TRUE;
aboutButton.enabled = FALSE;
}
当您先隐藏一个按钮,然后显示另一个按钮时,可能会有一个小间隙,从而产生闪烁。我认为最好先显示另一个按钮。好的,我解决了这个问题。我试着做了一点逆向工程,但我想我会把我所做的发布出来,以防对其他人有所帮助 我做的第一件事是修改AboutButtoTouched方法来记录按钮的状态属性,它是一个位整数:
- (IBAction)aboutButtonTouched:(id)sender
{
rulesButton.enabled = TRUE;
[sender setEnabled:FALSE];
NSLog(@"%d", [sender state]);
}
此时,按钮通过setEnabled被禁用,日志报告状态为“3”。查看uicontrol状态的位掩码类型:
enum {
UIControlStateNormal = 0, // 0
UIControlStateHighlighted = 1 << 0, // 1
UIControlStateDisabled = 1 << 1, // 2
UIControlStateSelected = 1 << 2, // 4
UIControlStateApplication = 0x00FF0000,
UIControlStateReserved = 0xFF000000
};
需要注意的是,尽管未记录,但包含
UIControlStateHighlighted | UIControlStateDisabled
的所有状态组合都无效:它们与不包含UIControlStateDisabled
的状态组合相同
简言之:
(UIControlStateHighlighted | UIControlStateDisabled)==UIControlStateHighlighted
及
(UIControlStateSelected | UIControlStateHighlighted | UIControlStateDisabled)==(UIControlStateSelected | UIControlStateHighlighted)
我发现最困难的方法是:为高亮显示+禁用状态设置一些属性,这会覆盖我对高亮显示状态的设置。花了半天时间来追查为什么按钮没有正确突出显示…我不知道为什么;但在我对iOS5的测试中,它不是“3”,而是“5”。也就是“UIControlStateSelected | UIControlStateHighlighted”@HansPinckaers如果他们向位掩码添加了新项,值可能已经更改。我只是将UIButton子类化,并添加了一个将状态1设置为5的方法。不再闪烁:)
[self setBackgroundImage:normalImage forState:UIControlStateNormal];
[self setBackgroundImage:highlightedImage forState:UIControlStateDisabled];
[self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted];
[self setBackgroundImage:highlightedImage forState:UIControlStateHighlighted|UIControlStateDisabled];