3

UIPicker選択した行を緑色のテキストで表示するを取得しようとしています。メソッドを使用pickerView:viewForRow:forComponent:reusingView:して UILabel を作成します。

- (UIView*) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
    UILabel *label = (UILabel*)view;
    if (label == nil) {
        label = [UILabel new];
        label.font = [UIFont boldSystemFontOfSize: 24];
        label.adjustsFontSizeToFitWidth = YES;
    }
    UIColor *color = (row == [pickerView selectedRowInComponent: component]) ? RGBx(0x579B2F) : UIColor.whiteColor;
    label.textAlignment = component == 0 ? NSTextAlignmentRight : NSTextAlignmentLeft;
    NSMutableAttributedString *string;
    if (component == 0) {
        string = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%3lu.", row]];
        [string addAttribute:NSForegroundColorAttributeName value: color range:NSMakeRange(0, string.length - 1)];
        [string addAttribute:NSForegroundColorAttributeName value: [UIColor clearColor] range:NSMakeRange(string.length - 1,1)];
    }
    else {
        string = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@".%02lu", row % 60]];
        [string addAttribute:NSForegroundColorAttributeName value: [UIColor clearColor] range:NSMakeRange(0,1)];
        [string addAttribute:NSForegroundColorAttributeName value: color range:NSMakeRange(1,string.length - 1)];
    }
    label.attributedText = string;
    return label;
}

そこには、2 つのホイールを密接に配置するための追加要素がいくつかありますが、少し間隔を空けています (透明な期間)。それは主に動作します:

ここに画像の説明を入力

最初は、緑の選択と白/灰色の選択が完璧に見えます。問題は、ホイールをスクロールしても常に緑色になるとは限らないことです。時々そうしますが、常にではありません。ご覧のとおり、スクロールされた値は、選択されていなくても緑色のままになることがあります (09右上隅の を参照)。

緑のみを選択した行に常に保持するにはどうすればよいですか?

4

2 に答える 2

1

行が最初に緑色であった場合、この行がまだ表示されるまで上下にスクロールすると、viewForRow:(NSInteger)row forComponent: がその行で呼び出されないため、緑色が保持されます (これが行は以前は表示されていなかったため、表示する必要があります)...

selectedRowinCompoment で緑を選択済みに設定する必要がある一方で、古い選択行から緑の色を削除する必要もあります (まだ表示されている場合)。

于 2015-08-05T17:35:15.117 に答える
0

@idali は問題をよく診断します。そして、何が起こる必要があるかについてのヒント。しかし、実際の答えは出していません。

答えはreloadComponent:(またはreloadAllComponents) を使用することです。ユーザーが選択を変更したとき、またはプログラムで値を変更したときはいつでも実行する必要があります。例えば

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

そしてあなたが使うときはいつでもselectRow:inComponent:animated:

...
[self.picker selectRow: hours inComponent: 0 animated: YES];
[self.picker reloadAllComponents];
...
于 2015-08-07T17:01:33.313 に答える