2010-04-04 78 views
3

我在我的iPhone应用程序中有一个非常具体的“错误”。我为按钮的突出显示和正常状态设置了两个图像。它按预期的方式工作,当你“按下”,然后以缓慢的速度“接近”时,但如果你点击/快速点击它,状态之间会有明显的闪烁。这是一个已知的错误还是我错误地设置状态?UIButton和UIControlEventState问题

下面是一个创建按钮的代码:

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; 
} 

有什么想法?

回答

8

好的,我解决了这个问题。对我正在尝试做的事情进行了一些逆向工程,但是我认为我会发布我所做的事情以防别人帮助其他人。

我做的第一件事就是修改aboutButtonTouched方法记录按钮的状态属性,它是一个位掩码NSUInteger:

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

    NSLog(@"%d", [sender state]); 
} 

在这一点上,按钮被通过的setEnabled禁用和日志报告国家是“3”。查看UIControlState的位掩码类型:

enum { 
    UIControlStateNormal    = 0,   // 0 
    UIControlStateHighlighted   = 1 << 0,  // 1 
    UIControlStateDisabled    = 1 << 1,  // 2 
    UIControlStateSelected    = 1 << 2,  // 4 
    UIControlStateApplication   = 0x00FF0000, 
    UIControlStateReserved    = 0xFF000000 
}; 

(注释由于我永远不会记住按位)。我们可以看到要获得“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]; 
+0

我不知道为什么;但在iOS5测试中,它不是“3”而是“5”。哪个是“UIControlStateSelected | UIControlStateHighlighted” – HansPinckaers 2011-11-17 17:02:31

+0

@HansPinckaers如果他们向位掩码添加了新项目,则值可能已更改。 – typeoneerror 2011-11-17 17:21:02

+0

嗯,我只是子类UIButton并添加了一个方法来设置状态1到5.没有更多的闪烁:) – HansPinckaers 2011-11-19 13:50:02

0

也许你应该反向变化的按钮

的序列当你第一次隐藏一个按钮,然后显示其他,也许有一点点差距,这就造成闪烁。我认为最好先显示其他按钮。

+0

没有运气。同样的交易。 – typeoneerror 2010-04-04 23:19:38

1

要注意的是,虽然没有记录,包含UIControlStateHighlighted|UIControlStateDisabled所有状态的组合是无效的:这些都是相当于同一没有UIControlStateDisabled

简而言之:

(UIControlStateHighlighted | UIControlStateDisabled) == UIControlStateHighlighted

(UIControlStateSelected | UIControlStateHighlighted | UIControlStateDisabled) == (UIControlStateSelected | UIControlStateHighlighted)

我发现硬盘的方式:被设置为其覆盖我的设置为高亮显示+禁用状态的一些属性突出显示的状态。花了半天的时间来追踪问题为什么按钮没有正确突出显示...