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)
有关此快速点击闪烁的任何想法?
好的,我解决了这个问题.采取了一些逆向工程,我试图做的,但我想我会发布我所做的,以防它帮助其他人.
我做的第一件事是修改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)
| 归档时间: |
|
| 查看次数: |
2798 次 |
| 最近记录: |