Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UIButton和UIControlEventState问题_Iphone_Objective C_Button - Fatal编程技术网

Iphone UIButton和UIControlEventState问题

Iphone UIButton和UIControlEventState问题,iphone,objective-c,button,Iphone,Objective C,Button,我的iPhone应用程序中有一个非常特殊的“bug”。我正在为按钮的突出显示和正常状态设置两个图像。当你以缓慢的速度“按下”然后“触摸”时,它会像预期的那样工作,但是如果你快速点击它,状态之间会有明显的闪烁。这是一个已知的错误还是我设置的状态不正确 以下是创建按钮的代码: UIImage *normalImage = [[UIImage imageNamed:@"btn-small.png"] stretchableImageWithLeftCapWidth:10.0f topCapHeight

我的iPhone应用程序中有一个非常特殊的“bug”。我正在为按钮的突出显示和正常状态设置两个图像。当你以缓慢的速度“按下”然后“触摸”时,它会像预期的那样工作,但是如果你快速点击它,状态之间会有明显的闪烁。这是一个已知的错误还是我设置的状态不正确

以下是创建按钮的代码:

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