UIPickerView selection indicator not visible in iOS10

匿名 (未验证) 提交于 2019-12-03 02:51:02

问题:

I build my project in Xcode 8. UIPickerView separator lines are not visible in iOS 10 simulator and the devices, but works fine on iOS 9.3 devices and simulator. I tried to adjust the UIPickerView back ground color, auto layouts and everything possible in the XIB, but nothing works. Anyone have an idea on this?

This is a custom view which contains a UIPickerView

-(void)layoutSubviews{ isShown = NO; [super layoutSubviews];  //self.selectedDic = nil;  self.doneBtn.tintColor = COLOR_DB3535; self.pickerView.backgroundColor = COLOR_DEDEDE; self.pickerView.showsSelectionIndicator = YES;  [self.doneBtn setTitle:NSLocalizedString(@"App_Generic_Button_Text_Done", @"")]; }   -(UIView*)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 50)]; label.tintColor = [UIColor clearColor]; label.backgroundColor = [UIColor yellowColor]; label.textColor = COLOR_666; label.font = [FontsManager getFONT_ROBOTO_LIGHT_16]; label.textAlignment = NSTextAlignmentCenter; NSDictionary *dict = [dataArray objectAtIndex:row]; label.text = @"Test"; return label; } 

回答1:

I had this exact issue when I rebuilt a couple of solutions for iOS10 and deployed to iOS10 on both simulators and devices.

I narrowed the problem in my case to be down to selecting an item in the picker during initialisation. ie. I populate my picker and if we have already got a selection for this property then I preselect it and the lines are present. I do this during the initialisation when I set up my picker.

So my fix, which worked in my use case, was to select the 0 element in the case of no existing value.

Objective-C

UIPickerView *pickerView;  ...  [pickerView selectRow:0 inComponent:0 animated:YES]; 

Swift

let pickerView: UIPickerView  ...  pickerView.selectRow(0, inComponent: 0, animated: true) 

This was fine for my solution since I effectively select row zero on setup.

I haven't had chance to dig into the reasoning or look for a cleaner solution, but since I've solved my problem I thought I'd share it here to help you all out if I can.



回答2:

UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 320, 200)]; pickerView.backgroundColor = [UIColor whiteColor]; pickerView.dataSource = self; pickerView.delegate = self; [pickerView selectRow:0 inComponent:0 animated:YES]; [self.view addSubview:pickerView]; 

add the code [pickerView selectRow:0 inComponent:0 animated:YES]; before pickerView added to superView.



回答3:

I have faced the same issue in iOS10, too. Here is my problem:

And I solved this problem by:

 self.pickerView.backgroundColor = COLOR_DEDEDE;  self.pickerView.showsSelectionIndicator = YES;     for (UIView *view in self.pickerView.subviews) {         if (view.bounds.size.height < 2.0f && view.backgroundColor == nil) {             view.backgroundColor = PICK_Line_COLOR; // line color         }     } 

Note:

this code mush be called after method:[self.view addSubview:pickeView];

The final result:

it works in my project. Hope it helps to you.



回答4:

I'm not sure what "separator lines" you are talking about. I don't see "separator lines" in iOS 9 either.

The only "lines" missing from your screen shot are the selection indicator. You can get them by setting the picker view's showsSelectionIndicator to YES. But you shouldn't have to; showing the selection indicator is the default. The docs say:

On iOS 7 and later ... the selection indicator is always shown



回答5:

This is my code:

-(UIView*)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{      for(UIView *single in pickerView.subviews)     {         if (single.frame.size.height < 1)         {             single.backgroundColor = [UIColor grayColor];         }     }    //other code  } 


回答6:

I am also facing the same issue. Below is my code for creating the UIPickerView:

self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, frame.size.height - 216, frame.size.width, 216)]; self.pickerView.dataSource = self; self.pickerView.delegate = self; self.pickerView.backgroundColor = [UIColor whiteColor]; self.pickerView.showsSelectionIndicator = YES; [self addSubview:self.pickerView]; 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!