0

私はカスタム PickerView に取り組んでいます。ピッカーに 2 つのコンポーネント (時間、分) があり、分のコンポーネントの「0」を灰色にして選択できないようにしました。行が再利用されることを除いて、すべて正常に動作します。 .. グレーのフォントで「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

「再利用された行」の問題を理解しました。以下の方法で「ビュー」を「nil」に置き換えるのと同じくらい簡単でした。

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

これを理解するのに数時間かかりました..うわー、プログラミングが大好きなのも不思議ではありません! :)

于 2013-04-24T04:08:54.923 に答える
0

これは問題を引き起こしているコードです:

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

問題は、行が再利用されるため、1 つの行を灰色に設定すると、スタックから外れて、いつか戻ってくるということです。戻ってきても、ラベルの色は灰色のままです。

したがって、コードは次のように変更する必要があります

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 に答える