UIPickerView的主要內容實際上並不多,主要是一個UIPickerView類和對應的UIPickerViewDelegate,UIPickerViewDataSource協議,分別表示代理和數據源。在此不細說這些,只是解答我們遇到的一個小需求。
通常,UIPickerView是可以定義多列內容的,比如年、月、日三列,這些列之間相互不干擾,可以自已滾自己的,不礙別人的事。不過,我們有這麼一個需求,也是有三列,但這三列需要一起滾。嗯,這個就需要另行處理了。
在UIPickerViewDelegate中,聲明了下面這樣一個代理方法:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
我們通過這個方法就可以來自定義行的視圖。時間不早,廢話就不多說了,直接上代碼吧:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { PickerViewCell *pickerCell = (PickerViewCell *)view; if (!pickerCell) { NSInteger column = 3; pickerCell = [[PickerViewCell alloc] initWithFrame:(CGRect){CGPointZero, [UIScreen mainScreen].bounds.size.width, 45.0f} column:column]; } [pickerCell setLabelTexts:@[...]]; return pickerCell; }
我們定義了一個PickerViewCell視圖,裡面根據我們的傳入的column參數來等分放置column個UILabel,並通過setLabelTexts來設置每個UILabel的文本。當然,我們也可以在PickerViewCell去定義UILabel的外觀顯示。就是這麼簡單。
不過,還有個需要注意的就是,雖然看上去是顯示了3列,但實際上是按1列來處理的,所以下面的實現應該是返回1:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; }
參考
UIPickerViewDelegate Protocol Reference