2012-01-17 2 views
1

나는 pickerView 위에 버튼을 만들어 그것을 닫습니다. 그리고 나는 여기에 을 작성했다고 생각합니다. pickerView와 해제 버튼을 시작하는 코드입니다.내가 만질 수없는 UIButton

UIPickerView *tempPickerView = [[[UIPickerView alloc] initWithFrame: 
     CGRectMake(kPickerViewX, kPickerViewY, kPickerViewWidth, kPickerViewHeight)] autorelease]; 
    tempPickerView.showsSelectionIndicator = YES; 
    tempPickerView.delegate = self; 
    tempPickerView.dataSource = self; 
    UIButton *pickerButton = [[UIButton alloc] initWithFrame:CGRectMake(0, -32, 52, 32)]; 
    [pickerButton setBackgroundImage:[UIImage imageNamed:@"week.png"] 
     forState:UIControlStateNormal]; 
    [pickerButton addTarget:self action:@selector(hidePicker) 
     forControlEvents:UIControlEventTouchUpInside]; 
    [tempPickerView addSubview:pickerButton]; 
    [tempPickerView bringSubviewToFront:pickerButton]; 
    [pickerButton release]; 

    [self.view addSubview:tempPickerView]; 
    return tempPickerView; 

는 그것은 다음과 같습니다

enter image description here

pickerView의 왼쪽 cornor에있다 그 버튼의 "주"잊어, 그냥 임시 이름입니다.

문제는이 버튼을 만질 수 없다는 것입니다. 터치하려고 할 때마다 talbeViewCell과 같은 요소를 직접 만졌을뿐입니다.

피커 뷰 프레임 외부에 단추를 추가했기 때문입니까? 나는 버튼의 원점의 좌표를 의미

은 좌표와 함께이 문제입니다, (0, -32)입니다 그것이 pickerView 위에 표시 될 수 있도록

?

누구든지이 문제를 해결하는 방법을 말할 수 있습니까?

고맙습니다.

+0

단추를 표준 둥근 모서리 사각형 단추로 바꾸고 다시 시도해보십시오. – Raptor

답변

5

문제는 부모보기의 경계 외부에 단추를 배치했기 때문입니다. 이제 iOS가이 작업을 수행합니다 (단순화되었지만 100 % 정확하지는 않지만 거래를하게됩니다).

  • 터치가 발생했음을 알립니다. 터치의 좌표를 계산합니다.
  • 그런 다음 어떤보기가 터치되었는지 확인하려고합니다. 이렇게하려면 앱의 UIWindow 객체에서 hitTest:withEvent: 메소드를 호출합니다.
  • 각 자식에 대해 hitTest:withEvent:이 차례로 호출되며, 필요하다면 각 자식은 hitTest:withEvent:을 호출합니다.
  • 뷰의 hitTest:withEvent:이 호출되면 먼저 좌표가 자체 경계 (IIRC) 내에 있는지 확인합니다. 그렇지 않으면 nil을 반환합니다. 그렇지 않으면 자식에 대해 hitTest:withEvent:을 호출합니다.

hitTest:withEvent: documentation 명시 적으로 말한다 : 수신기의 경계 외부에있는

포인트는 실제로 수신기의 파단 중 하나 내에있는 경우에도 안타로보고되지 않습니다.

이제 버튼이 상위보기 밖에 있습니다. 따라서 hitTest:withEvent:은 터치 좌표가 피커 뷰의 범위 안에 있지 않으며 결코 맞을 수 있는지 여부를 자녀 (버튼)에게 묻지 않는다고 결정합니다.

피커를 서브 클래스 화하고 이것을 수정하려면 hitTest:withEvent: 메서드를 재정의 할 수 있지만 실제 수정은 버튼이 자식이 아닌 피커의 형제가되도록 이동하는 것입니다.

+0

고마워요! 내가 뭘해야하는지 알았어! pickerView뿐만 아니라이 버튼을 사용하여 뷰를 만들려고합니다. –

1

이것은 UIPickerView의 히트 테스트 방법으로 인해 발생할 수 있다고 생각합니다. 터치가 범위를 벗어날 경우 pointInside:withEvent:에서 NO을 반환 할 수 있습니다. 헤더 파일 (UIView.h) 주석

기본 수익률을 말한다 YES 포인트가 아니라 이유가 될 수 경계

당신이 UIPickerView의 경계 외부에 버튼을 배치하기 때문에

에있는 경우.

해결 방법으로 피커의 수퍼 뷰에 단추를 삽입 할 수 있습니다.