2010-04-04 3 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

좋아, 해결했습니다. 내가하려고했던 일을 리버스 엔지니어링으로 전환했지만, 내가 다른 사람을 돕기 위해 내가 한 일을 게시하겠다고 생각했다.

내가했던 제일 먼저 비트 마스크 NSUInteger있는 버튼의 상태 속성에 로그인 할 aboutButtonTouched 방법을 수정했다 :

- (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

+0

@HansPinckaers 새 항목을 비트 마스크에 추가하면 값이 변경 될 수 있습니다. – typeoneerror

+0

음, 그냥 UIButton 서브 클래 싱하고 상태를 1로 설정하는 메서드를 추가했습니다. 더 이상 깜박임 : – HansPinckaers

0

어쩌면 당신은 플리커를 만드는 작은 차이가, 어쩌면 거기에, 버튼

변화의 순서를 반대로해야한다. 다른 버튼을 먼저 표시하는 것이 더 좋습니다.

+0

행운을 빈다. 같은 거래. – typeoneerror

1

문서화되지는 않았지만, UIControlStateHighlighted|UIControlStateDisabled를 포함하는 모든 국가 조합이 유효하지 않은 것을 주목해야한다 : 이러한 UIControlStateDisabled없이 동일한에 해당합니다. 한마디로

:

(UIControlStateHighlighted | UIControlStateDisabled) == UIControlStateHighlighted

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

내가 어려운 방법이 발견

다음 내 설정을 덮어 쓰기 한 강조 + 장애 상태에 대한 몇 가지 속성을 설정했다 강조 표시된 상태. 반세기 동안 버튼이 제대로 강조 표시되지 않는 문제를 추적하려면 ...