2009-10-28 6 views
2

내가 원하는 것은 다음과 같습니다.UIPickerView - 행을 강조 표시 할 때 발생하는 이벤트

UIPickerView가 표시됩니다. 사용자가 선택한 행을 터치하면 행이 잠기고 (다중 구성 요소 선택기) 다른 구성 요소는 자유롭게 회전 할 수 있습니다. 행이 이미 잠겨 있고 사용자가 잠긴 행을 터치하면 그 행은 잠기지 않고 자유롭게 회전 할 수 있습니다. 이미 버튼을 사용하여 코딩 된 잠금 부분이 있습니다. 단추를 제거하고 강조 표시된 선택기 옵션으로 바꾸고 싶습니다.

이 나는 ​​시도했다 : 행이 아직 선택되지 않은

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { 
} 

분명히이 유일한 화재 만약 내가 강조 표시된 영역에 행을 터치하면 그래서,이 이벤트가 발생하지 않습니다. 피커 터치시

나는 다음이 사건 화재의

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"touchesBegan"); 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"touchesMoved"); 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
NSLog(@"touchesEnded"); 
} 

없음을 시도합니다.

피커의 강조/선택된 행을 사용자가 터치하는 경우를 감지하는 방법에 대한 아이디어가 있습니까?

답변

2

글쎄, 내가 원하는 바를 정확히 수행 한 간단한 해결책이 있습니다. 기본적으로 사용자가 다중 컴포넌트 선택기보기에서 선택 막대를 탭하고 다른 사용자가 자유롭게 회전 할 수 있도록 해당 구성 요소를 잠궈 야합니다. 여기

내가 무슨 짓을 :

우선 - 선택 막대를 표시하는 옵션을 끄십시오.

두 번째 - 각 구성 요소에 하나씩 - 레이블은 선택기 막대와 동일한 높이와 위치이지만 각 구성 요소 위에 하나씩 있습니다. 그들은 서로 단단한 막대로 보입니다.

세 번째 - 라벨의 색상을 변경하여 사용자에게 고정되어 있음을 나타내는 방법을 만듭니다. 또한 부울 플래그를 사용하여 구성 요소가 잠길 때 프로그램에서 프로세스를 알릴 수 있습니다.

- (IBAction) lockButtonPress:(id)sender { 

    // determine which button was pressed.... 
    int btnPressed = 0; 
    if (leftSelectionBar.touchInside) btnPressed = 1; 
    if (centerSelectionBar.touchInside) btnPressed = 2; 
    if (rightSelectionBar.touchInside) btnPressed = 3; 

    // we are not going to make this difficult -- images for different states..... default in viewWillShow 
    switch (btnPressed) { 
     case 1: 
      if (lockSelected0) { 
       lockSelected0 = FALSE; 
       [leftSelectionBar setBackgroundColor:[UIColor blueColor]]; 
       [leftSelectionBar setAlpha:0.25]; 
      } else { 
       lockSelected0 = TRUE; 
       [leftSelectionBar setBackgroundColor:[UIColor redColor]]; 
       [leftSelectionBar setAlpha:0.45]; 

      } 
      break; 
     case 2: 
      if (lockSelected1) { 
       lockSelected1 = FALSE; 
       [centerSelectionBar setBackgroundColor:[UIColor blueColor]]; 
       [centerSelectionBar setAlpha:0.25]; 
      } else { 
       lockSelected1 = TRUE; 
       [centerSelectionBar setBackgroundColor:[UIColor redColor]]; 
       [centerSelectionBar setAlpha:0.45]; 
      } 
      break; 
     case 3: 
      if (lockSelected2) { 
       lockSelected2 = FALSE; 
       [rightSelectionBar setBackgroundColor:[UIColor blueColor]]; 
       [rightSelectionBar setAlpha:0.25]; 
      } else { 
       lockSelected2 = TRUE; 
       [rightSelectionBar setBackgroundColor:[UIColor redColor]]; 
       [rightSelectionBar setAlpha:0.45]; 
      } 
      break; 
     default: 
      break; 
    } 
} 

그리고 그 .... 간단하게입니다)

0

(무효) pickerView : (UIPickerView *) thePickerView didSelectRow : (NSInteger) 행 inComponent : (NSInteger) 구성 요소 { // 사용자 정의 코드 여기

// 예를 들어 UIPickerView - [list objectAtIndex : row]에 값이 표시되는 NSArray 또는 NSMutableArray가 "list"로 호출 된 경우 UIPickerView 이벤트에서 반환 된 행은 객체 자체를 반환합니다. . 다음 코드는 UIPickerView에 탭 제스처를 가로 탭이 UIPickerView의 선택의 인디케이터 (indicator) 이내인지 확인합니다

0

} :

첫째, 우리는 탭 제스처를 차단하기 위해 UITapGestureRecognizer을 추가 할 것 . 참고로, UIPickerView은 휠과 모든 것을 돌리는 일을해야하기 때문에 터치를 취소하고 싶지는 않습니다.탭이 UIPickerView의 선택의 인디케이터 (indicator) 이내 경우

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UITapGestureRecognizer* gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(pickerViewTapGestureRecognized:)]; 
    gestureRecognizer.cancelsTouchesInView = NO; 

    [self.pickerView addGestureRecognizer:gestureRecognizer]; 
} 

둘째, 우리는 (가정 선택의 인디케이터 (indicator)가 UIPickerView의 높이의 약 15 %를 사용하는 -이 값을 조정해야 할 수도 있습니다), 확인해 보겠습니다 : 우리는 SEL을 검출하고 있기 때문에

- (void)pickerViewTapGestureRecognized:(UITapGestureRecognizer*)gestureRecognizer 
{ 
    CGPoint touchPoint = [gestureRecognizer locationInView:gestureRecognizer.view.superview]; 

    CGRect frame = self.pickerView.frame; 
    CGRect selectorFrame = CGRectInset(frame, 0.0, self.pickerView.bounds.size.height * 0.85/2.0); 

    if(CGRectContainsPoint(selectorFrame, touchPoint)) 
    { 
     NSLog(@"Selected Row: %i", [self.currentArticles objectAtIndex:[self.pickerView selectedRowInComponent:0]]); 
    } 
} 

당신은 하지

- (void)pickerView:(UIPickerView*)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 

를 구현해야합니다 지금 당장은 당장

관련 문제