Исправлены метки в панели выбора UIPickerView - PullRequest
32 голосов
/ 15 декабря 2008

В приложении часов на экране таймера отображается средство выбора (вероятно, UIPicker в режиме UIDatePickerModeCountDownTimer) с некоторым текстом на панели выбора (в данном случае «часы» и «минуты»).

(правка) Обратите внимание, что эти метки фиксированы : они не двигаются, когда колесо подборщика вращается.

Можно ли отобразить такие фиксированные метки на панели выбора стандартного компонента UIPickerView?

Я не нашел API, который бы помог с этим. Было предложено добавить UILabel в качестве подпредставителя сборщика, но это не сработало.


Ответ

Я последовал совету Эда Марти (ответ ниже), и это работает! Не идеально, но это должно обмануть людей. Для справки, вот моя реализация, не стесняйтесь сделать ее лучше ...

- (void)viewDidLoad {
    // Add pickerView
    self.pickerView = [[UIPickerView alloc] initWithFrame:CGRectZero];
    [pickerView release];
    CGSize pickerSize = [pickerView sizeThatFits:CGSizeZero];
    CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
    #define toolbarHeight           40.0
    CGFloat pickerTop = screenRect.size.height - toolbarHeight - pickerSize.height;
    CGRect pickerRect = CGRectMake(0.0, pickerTop, pickerSize.width, pickerSize.height);
    pickerView.frame = pickerRect;

    // Add label on top of pickerView
    CGFloat top = pickerTop + 2;
    CGFloat height = pickerSize.height - 2;
    [self addPickerLabel:@"x" rightX:123.0 top:top height:height];
    [self addPickerLabel:@"y" rightX:183.0 top:top height:height];
    //...
}

- (void)addPickerLabel:(NSString *)labelString rightX:(CGFloat)rightX top:(CGFloat)top height:(CGFloat)height {
#define PICKER_LABEL_FONT_SIZE 18
#define PICKER_LABEL_ALPHA 0.7
    UIFont *font = [UIFont boldSystemFontOfSize:PICKER_LABEL_FONT_SIZE];
    CGFloat x = rightX - [labelString sizeWithFont:font].width;

    // White label 1 pixel below, to simulate embossing.
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x, top + 1, rightX, height)];
    label.text = labelString;
    label.font = font;
    label.textColor = [UIColor whiteColor];
    label.backgroundColor = [UIColor clearColor];
    label.opaque = NO;
    label.alpha = PICKER_LABEL_ALPHA;
    [self.view addSubview:label];
    [label release];

    // Actual label.
    label = [[UILabel alloc] initWithFrame:CGRectMake(x, top, rightX, height)];
    label.text = labelString;
    label.font = font;
    label.backgroundColor = [UIColor clearColor];
    label.opaque = NO;
    label.alpha = PICKER_LABEL_ALPHA;
    [self.view addSubview:label];
    [label release];
}

Ответы [ 11 ]

0 голосов
/ 14 февраля 2009

Можете ли вы показать, где вы определяете pickerTop и pickerSize?

    CGFloat pickerTop = timePicker.bounds.origin.y;
CGSize pickerSize = timePicker.bounds.size;

Это то, что у меня есть, но pickerTop кажется неправильным.

микрофон

...