UIPickerView内容意外流动

时间:2016-05-09 09:03:43

标签: ios objective-c uipickerview uidatepicker

我在我的应用中使用UIDatePickerUIPickerView。但两个控件都显示出奇怪的行为。当我在选择器中滚动内容时,它会在选择器外部流动,并且不会按预期滚动。我的实现如下。

sexArray = @[@"Male", @"Female"];
UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 50, 100, 150)];
[picker setDataSource: self];
[picker setDelegate: self];
picker.showsSelectionIndicator = YES;
genderTF.inputView = picker;


#pragma mark -- UIPICKERVIEW METHODS

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return sexArray.count;
}

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 1;
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
      forComponent:(NSInteger)component reusingView:(UIView *)view {
UILabel *retval = (UILabel*)view;
if (!retval) {
    retval = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100, [pickerView rowSizeForComponent:component].height)];
}

retval.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:15.0f];
retval.minimumScaleFactor = 0.6;
[retval setTextAlignment:NSTextAlignmentCenter];
retval.text = [sexArray objectAtIndex:row];

return retval;
}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
[genderTF setText:sexArray[component]];
}

当在另一个应用程序中使用相同的代码(用于测试)时,它会按预期工作。

Editing began

When content Scrolled

3 个答案:

答案 0 :(得分:2)

事实证明,我的实施是正确的。问题是因为第三方图书馆。

我在我的项目中使用了一个pod SLPagingView,它创建了`UIPickerView'行为怪异。我无法找到解决方案,最终用类似的吊舱替换吊舱。

详情link

答案 1 :(得分:0)

您需要实施titleForRow而不是viewForRow

 -(NSString*)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{


return [sexArray objectAtIndex:row];

 }

更新:

如果您使用input view textfield作为UIPickerView *picker = [[UIPickerView alloc] init]; 的选择器视图,请不要使用框架初始化它。

初始选择器视图,如

return

希望这会有所帮助:)

答案 2 :(得分:0)

我发现这个问题导致我使用了名为“SLPagingView”的第三方库,我不知道你是否也使用过它。 如果你这样做,这可能有所帮助。我刚刚通过在“UIScrollView + UpdateContentSize.m”文件中修改 - (void)setFrame:(CGRect)框架和 - (void)updateConstraints方法解决了这个问题,这是我的代码:

#pragma mark - OVERRIDE
-(void)setFrame:(CGRect)frame {
    [super setFrame:frame];
    // Scale the content size
    Class UIPickerTableView = NSClassFromString(@"UIPickerTableView");
    if ([self class] == UIPickerTableView) {
        return;
    }else {
        [self updateContentSize];
    }
}

-(void)updateConstraints {
    [super updateConstraints];
    // Scale the content size
    Class UIPickerTableView = NSClassFromString(@"UIPickerTableView");
    if ([self class] == UIPickerTableView) {
        return;
    }else {
        [self updateContentSize];
    }
}

这有效并希望它也可以帮到你。