2009-10-28 54 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的)組件 {// 自定義代碼這裏

//例如,如果你有一個名爲「list」的NSArray或NSMutableArray,其值在UIPickerView - [list objectAtIndex:row]上顯示,其中行是由UIPickerView事件返回的索引將返回對象本身。

}

0

下面的代碼片段將攔截在UIPickerView的輕敲姿勢,並確定是否水龍頭是UIPickerView的選擇指標內:

首先,我們將添加一個UITapGestureRecognizer攔截輕敲姿勢。請注意,我們不希望取消觸摸,因爲UIPickerView仍然應該做它的所有事情。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

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

    [self.pickerView addGestureRecognizer:gestureRecognizer]; 
} 

第二,我們要檢查,如果水龍頭是UIPickerView的選擇指標內(假設選擇指示器使用大約15%的UIPickerView的高度 - 你可能需要調整這個數值) :

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

因爲我們檢測SEL現在我們自己動手。