2010-02-16 4 views
2

uipickerview에 제스처 이벤트를 추가하여 탭을 변경하는 방법은 무엇입니까? 사용자 지정 클래스를 만들어야하지만 uipickerview를 처리하는 방법을 알지 못합니다. 현재 현재 uiviews에 제스처가 있지만 uipickerview에 문제가 있습니다. 뷰에 대한iPhone UIPickerView 제스처

내 코드 : 도움을

#define HORIZ_SWIPE_DRAG_MIN 100 
CGPoint mystartTouchPosition; 
BOOL isProcessingListMove; 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint newTouchPosition = [touch locationInView:self.view]; 
    if(mystartTouchPosition.x != newTouchPosition.x || mystartTouchPosition.y != newTouchPosition.y) { 
     isProcessingListMove = NO; 
    } 
    mystartTouchPosition = [touch locationInView:self.view]; 
    [super touchesBegan:touches withEvent:event]; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = touches.anyObject; 
    CGPoint currentTouchPosition = [touch locationInView:self.view]; 

    // If the swipe tracks correctly. 
    double diffx = mystartTouchPosition.x - currentTouchPosition.x + 0.1; // adding 0.1 to avoid division by zero 
    double diffy = mystartTouchPosition.y - currentTouchPosition.y + 0.1; // adding 0.1 to avoid division by zero 

    if(abs(diffx/diffy) > 2.5 && abs(diffx) > HORIZ_SWIPE_DRAG_MIN) 
    { 
     // It appears to be a swipe. 
     if(isProcessingListMove) { 
      // ignore move, we're currently processing the swipe 
      return; 
     } 

     if (mystartTouchPosition.x < currentTouchPosition.x) { 
      isProcessingListMove = YES; 
      self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0]; 
      return; 
     } 
     else { 
      isProcessingListMove = YES; 

      self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:2]; 

      return; 
     } 
    } 
    else if(abs(diffy/diffx) > 1) 
    { 
     isProcessingListMove = YES; 
     [super touchesMoved:touches withEvent:event]; 
    } 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    isProcessingListMove = NO; 
    [super touchesEnded:touches withEvent:event]; 
} 

감사합니다.

+0

정확히 무엇을하려고하는지 명확히 할 수 있습니다. UIPickerView로 트래핑 된 스 와이프 제스처로 UITabbar 탭을 전환하려고합니까? 스 와이프를 사용하여 UIPickerView 자체를 조작하려고합니까? – TechZen

답변

0

UIPickerView를 하위 클래스로 분류 할 수 없습니다.

그러나 피커 뷰는 다른 뷰에 표시되어야하므로 (전체 화면을 차지하지 않으므로) 해당 뷰의 컨트롤러에서 터치를 트랩하고 제스처를 필터링 할 수 있습니다.

(사용자가 취하려고하는 것을 이해한다고 가정하면 ...) 탭을 변경하기 위해 피커보기를 스 와이프하면 비표준 UI가되어 사용자를 혼란스럽게 할 것입니다. 피커 뷰는 컨트롤 유형으로 인식되기 때문에 피커의 일반적인 회전 동작 만 기대할 수 있습니다. 피커 뷰를 가로로 스 와이프하는 것을 어떻게 알았습니까?

+0

정답이면 옆에있는 체크 표시를 누르십시오. – TechZen

+1

당신은 확실히 UIPickerView를 서브 클래스화할 수 있습니다. 실제로 어떤 경우에는 그렇게하는 것이 좋지만 두 번째 절반은 나쁘지 않습니다. – pob21

0

나는 그것을 혼자두고 갔다. 혼란 스러웠을 겁니다. 맞습니다.

-1

ZT> UIPickerView를 하위 클래스로 분류 할 수 없습니다. "피커 뷰를 더 오래 회전시키기 위해 UIPickerView를 하위 클래스로 만들었으며 하위 클래스에는 정확히 하나의 메서드가있었습니다 (Longer Spinning and Blurring). UIPickerView Class Reference도 참조하십시오. "UIDatePicker 클래스는 UIPickerView의 사용자 지정 하위 클래스를 사용하여 날짜와 시간을 표시합니다."

2

UIPickerView를 하위 클래스로 만들 수 있습니다. 문제는 UIPickerTable이라는 하위 보고서 9 개로 구성되어 있으며 원하는 행에 touchesBegan:withEvent:과 같은 터치 이벤트를 수신하고 있다는 것입니다. 이 게시물의 끝에 포함 된 코드로 성공적으로 가로 챌 수있었습니다. Responding to touchesBegan in UIPickerView instead of UIView

다른 답변/의견도 유용합니다. 나는 비표준 (이 질문에서와 같이)을하고있는 누군가를 위해서가 아니라 UIPickerView를 서브 클래스 화하기를 원한다고 여기에 도착한 누군가를 위해 공중을 맑게하고 싶었다. 왜냐하면 받아 들여진 대답의 첫 번째 줄은 잘못 되었기 때문이다.

+0

런타임시 UIPickerView의 하위 뷰를 볼 때 표준 UIView 클래스라고하는 3 개만 보입니다. – stonedauwg