Как замаскировать UILabel в iOS - Objective-C - PullRequest
0 голосов
/ 16 февраля 2011

Я хочу создать подкласс UIView и поместить четыре UILabel поверх друг друга; верхняя метка будет MASK, 2-я метка будет обычной меткой с текстом, 3-я метка будет меткой со сплошным фоном без текста. нижняя метка будет такой же, как верхняя 2-я метка с другим цветным шрифтом. когда я отправлю ширину третьей метки, она закроет нижнюю метку, показывая частичный вид текста. Я хочу, чтобы 2-й текст был одним цветом, в то время как на непокрытой нижней метке отображается другой цветной шрифт.

Это возможно? Если кто-то может объяснить, как маскироваться в объективе-C, это тоже поможет.

Я пытаюсь создать UIView, который действует как индикатор выполнения, так как индикатор заполнен на 60%, я хочу, чтобы верхний текст отображался белым шрифтом, когда нижний текст отображается другим цветом.

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Вы можете сделать это с двумя UILabel, один снизу, а другой встроенным в другой вид сверху.

UILabel *bottomLabel = ...;
[self.view addSubview:bottomLabel];

UIView *topContainer = [[UIView alloc] initWithFrame:bottomLabel.frame];
topContainer.clipsToBounds = YES;
topContainer.opaque = NO;
topContainer.backgroundColor = [UIColor clearColor];

UILabel *topLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, bottomLabel.frame.size.width, bottomLabel.frame.size.height)];
topLabel.text = bottomLabel.text;
topLabel.opaque = NO;
topLabel.backgroundColor = [UIColor clearColor];

[topContainer addSubview:topLabel];
[self.view addSubview:topContainer];

Затем, когда вы захотите изменить прогресс, вы установите ширинуtopContainer.Это должно обрезать topLabel.

0 голосов
/ 16 февраля 2011

Вместо того, чтобы использовать четыре UILabel, почему бы не создать подкласс UILabel и нарисовать его самостоятельно в методе drawRect:?Это будет выглядеть примерно так:

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    // Set the mask
    CGContextClipToMask(context, self.bounds, /* mask image */);

    // Draw the text in a different font
    [self.text drawInRect:rect withFont:/* alternate font */];

    // Draw a solid background
    CGContextSetRGBFillColor(context, ...);
    CGContextFillRect(context, rect);

    // Draw the text normally
    [super drawRect:rect];
}

Для удобства вы можете создать маскирующее изображение и альтернативные свойства шрифта вашего подкласса.

...