2010-04-01 9 views
10

큰 반응 영역을 사용하여 UIButton을 만들 수 있기를 원합니다. 한 가지 방법은 하위 클래스의 hitTest 메서드를 재정의하는 것이지만 처음에는 사용자 정의 단추 개체를 인스턴스화하는 방법입니다. buttonWithType가있는 UIButton 아닌 OversizedButton 반환하기 때문에 iPhone : UIButton을 재정 의하여 buttonWithType을 반환하여 서브 클래스를 반환합니다.

[OversizedButton buttonWithType: UIButtonTypeDetailDisclosure]; 

는 상자 밖으로 작동하지 않습니다.

그래서 buttonWithType 메서드도 재정의해야 할 것처럼 보입니다. 누구든지이 작업을 수행하는 방법을 알고 있습니까?

@implementation OversizedButton 

+ (id)buttonWithType:(UIButtonType)buttonType 
{ 
    // Construct and return an OversizedButton rather than a UIButton 
    // Needs to handle special types such as UIButtonTypeDetailDisclosure 
    // I NEED TO KNOW HOW TO DO THIS PART 
} 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    // Return results if touch event was in oversized region 
    // I ALREADY KNOW HOW TO DO THIS PART 
} 

@end 

또는 어쩌면 alloc/initWithFrame을 사용하여 단추를 만들 수 있습니다. 하지만 buttonType 속성은 읽기 전용이므로 사용자 정의 단추 유형을 어떻게 만듭니 까?

참고 : 보이지 않는 버튼이 보이는 것 같은 다른 방법이 있음을 알고 있습니다. 나는 그 접근법에 관심이없고 그것을 피하는 것을 선호 할 것입니다. 위에서 설명한 방법에 대한 도움은 매우 유용합니다. 감사합니다

답변

0

buttonType 속성은 어디 UIKit에서 사용되지 않으며,이 속성이 IMO 오히려 무의미에 대한 귀하의 코드에서 당신은 항상 +buttonWithType:을 덮어 -isKindOfClass:을 확인할 수 있습니다. 그냥

return [[[OversizedButton alloc] initWithFrame:...] autorelease]; 

이 (당신은 문서화되지 않은 방법 _setButtonType:있는 버튼 타입을 대체 할 수 있습니다.)를 사용

+7

Apple 승인이 필요한 상업용 응용 프로그램에서 문서화되지 않은 방법을 사용하고 있다는 것을 진지하게 제안하고 있습니까? – Amagrammer

+0

@Ama :'buttonType' 속성에 신경 쓰지 않는 것이 좋습니다. 그러나 반드시해야한다면, 그것을 변경하는 유일한 방법은 문서화되지 않은 방법을 통해서입니다. – kennytm

+1

음, UIButtonTypeDetailDisclosure 버튼을 표시해야하므로 "신경 쓰지 않아"는 작동하지 않습니다. buttonWithType 메서드를 재정의 할 방법이 없다는 것을 알고 있다고 가정해야합니까? 감사합니다 – Amagrammer

3

UIButton buttonWithType:type 매개 변수의 값에 따라 UIButton 또는 UIRoundedRectButton을 반환합니다.

initWithType: 메서드를 제공하지 않으므로 buttonWithType:을 시도하고 다시 정의하는 것은 위험 할 것이라고 생각합니다.

서브 클래스 UIControl을 제안합니다. 그런 다음 하위 뷰로 버튼을 컨트롤에 추가하고 hitTest:withEvent:을 가로 챌 수 있습니다. 여기

+4

다른 것으로 보이기 때문에 실험하고 있습니다. 실용적이지 않습니다. 그것은 대단히 우아하지 않은 것 같습니다. 감사. – Amagrammer

1

내가 그것을 할 방법은 다음과 같습니다

+ (instancetype)customButtonWithCustomArgument:(id)customValue { 
    XYZCustomButtom *customButton = [super buttonWithType:UIButtonTypeSystem]; 
    customButton.customProperty = customValue; 
    [customButton customFunctionality]; 
    return customButton; 
} 

작품 또한 다른 유형, UIButtonTypeSystem 그냥 예입니다.