0

我正在开发自定义 PickerView,我在选择器中有两个组件(小时、分钟),我已将分钟组件中的“0”设为灰色且不可选择,除了行被重用外,一切正常。 .. 我的 Minutes 组件以灰色字体显示“0”(这是我想要的),但如果您滚动选择器,我会看到“7、14、21 .....”全部都是灰色字体!!这是我的代码

enter code here
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{

if(component == HOURS) {
        NSString *s = [self.arrayOfHours objectAtIndex:row];
        return [pickerView viewForShadedLabelWithText:s ofSize:20 forComponent:0 rightAlignedAt:52 reusingView:view];

    } else if (component == MINUTES) {
            NSString *s = [self.arrayOfMinutes objectAtIndex:row];
            return [pickerView viewForShadedLabelWithText:s ofSize:20 forComponent:1 rightAlignedAt:52 reusingView:view];
    }
    else return 0;
}


  - (UIView *)viewForShadedLabelWithText:(NSString *)title ofSize:(CGFloat)pointSize forComponent:(NSInteger)component rightAlignedAt:(CGFloat)offset reusingView:(UIView *)view {

//.........................    

    label = [self shadedLabelWithText:title ofSize:pointSize :component];

//..........................
 }



  - (UILabel *)shadedLabelWithText:(NSString *)label ofSize:(CGFloat)pointSize :(NSInteger)component 
{    

    UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];

    labelView.text = label;

    if([label isEqual:@"0"] && component == 1) {

        labelView.textColor = [UIColor grayColor];
    }

    return labelView;
    }

1 - 有人可以帮我避免选择器视图重用行吗?

2 - 如何使选择器视图以圆形/圆形显示行?

4

2 回答 2

0

这是给您带来麻烦的代码:

if([label isEqual:@"0"] && component == 1) {
    labelView.textColor = [UIColor grayColor];
}

你的问题是,由于行被重用,当你将一行设置为灰色时,它会离开堆栈,它会在某个时候回来。当它回来时,它的标签颜色仍然是灰色的。

所以,代码应该改成这样

if([label isEqual:@"0"] && component == 1) {
    labelView.textColor = [UIColor grayColor];
} else
{
    labelView.textColor = [UIColor blackColor]; // Or whatever color it normally is.
}

对于有关使其循环的问题,您可以将行数设置为一些疯狂的数字,例如10000(用户永远不会滚动浏览的数字)。然后将选取器的位置设置为 10K 的中间。然后,您将需要一个数组,其中包含要在“永无止境”选择器中显示的所有值。

然后,您将使用模运算符 ( %) 检查数组除以count当前行的余数。例如:

-(UIView *)somePickerWantsViewForRow:(int)row
{
    ...
    NSString *titleForRow = [self.someArray objectAtIndex:(self.someArray.count % row)];
    pickerRow.titleLabel.text = titleForRow;
}

在此示例中,someArray可能是('cat','dog','farmer','pizza').

于 2013-04-24T02:54:55.657 回答
0

我刚刚发现了“重用行”的问题,就像在下面的方法中用“nil”替换“view”一样简单。

return [pickerView viewForShadedLabelWithText:s ofSize:20 forComponent:1 rightAlignedAt:52 reusingView: nil ];

我花了几个小时才弄清楚这一点……哇,难怪我喜欢编程!:)

于 2013-04-24T04:08:54.923 回答