2013-04-08 107 views
1

我有一个UIButton,根据我的应用程序有4种不同的状态。从选择状态到正常状态时UIButton的高亮显示状态不会出现

state-1 normal. 
state-2 selected. 
state-3 highlighted , going normal-to-selected. 
state-4 highlighted , going selected-to-normal. 

最初按钮处于正常状态,当我按下它时,它会进入选定状态并在这些状态之间保持切换。

这是通过指定两个状态的图像并更改所选属性来实现的。

但是,在更改每个状态时,我需要更改突出显示的状态图像,以确保它在按下状态时表示状态3和状态4。

问题是,虽然从选中到正常,但它看起来像UIButton没有突出显示的状态。

因此,现在我保持一个BOOL伊娃来检查我的视图中的选择状态。 并保持按钮处于正常状态,并根据BOOL ivar的值每次操作将其图像更改为突出显示状态和正常状态。

有没有更简单的方法来实现这个目标?

回答

8

其原因是该州是两个值的混合。

一些最公地的人

UIControlStateNormal, 
UIControlStateHighlighted, 
UIControlStateDisabled, 
UIControlStateSelected, 
UIControlStateSelected | UIControlStateHighlighted, 
UIControlStateSelected | UIControlStateDisabled, 

了,所以如果你想有一个highlighted状态时selected然后我喜欢做这样的。

[button setImage:imageHighlighted forState:UIControlStateSelected | UIControlStateHighlighted]; 

如果是一般的规则是选择的时候可以做一些沿

UIControlState mixedState = UIControlStateSelected | UIControlStateHighlighted; 
    [button setImage:[button imageForState:state] forState:state]; 
    [button setBackgroundImage:[button backgroundImageForState:state] forState:state]; 
    [button setTitleColor:[button titleColorForState:state] forState:state]; 

线等等

+1

学到了一些有用的东西:)谢谢 – 2013-04-08 12:31:45

+0

所以,如果我保持一个图像的选择状态,一个正常。 一个用于选择+突出显示,一个用于突出显示, 然后自动图像将chnage基于按钮的状态而不需要单独的布尔型ivar? – 2013-04-08 12:37:33

+0

@AmoghTalpallikar是的,有用的理解的根本原因,而不仅仅是如何解决它。 :)关于你的第二个评论:是的,没错。 – hfossli 2013-04-08 12:42:56

0

将突出显示的状态保存在布尔变量中是跟踪状态的常用方法,但是这里只是简单的代码。

有一个setHighlighted方法在UIControl上调用,您可以覆盖。您可以设置变量在那里,而不是在多个动作:

-(void)setHighligted:(BOOL) highlighted { 
    self.mySavedHighlightedState = highlighted; 
} 

mySavedHighlightedState属性创建一个自定义的UIButton类来实现这一点。

+0

'self.isHighlighted'基本上只做你总是有相同的高亮状态这'(self.state&UIControlStateHighlighted)== UIControlStateHighlighted' – hfossli 2013-04-08 12:26:45

+0

@hfossil,我改变了变量名称。并不意味着隐藏'isHighlighted' getter。 – 2013-04-08 13:00:26

+0

这真是令人困惑。 – hfossli 2013-04-08 13:04:45