1

我想对 UIView 进行子类化并将四个 UILabel 放在一起;顶部标签将是 MASK,第二个标签将是带有文本的普通标签,第三个标签是没有文本的纯色背景标签。底部标签将与顶部第二个标签相同,但颜色字体不同。当我发送第三个标签的宽度时,它将覆盖底部标签,显示文本的部分视图。我想让第二个文本是一种颜色,而未覆盖的底部标签显示另一种颜色字体。

这可能吗?如果有人可以解释如何在 Objective-C 中进行掩码,那也会有所帮助。

我试图构建一个类似于进度条的 UIView,当进度条填充到 60% 时,我希望顶部文本以白色字体颜色显示,而底部文本以不同颜色显示。

4

2 回答 2

2

您可以使用两个 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

于 2011-02-16T15:35:51.010 回答
0

与其使用四个 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];
}

为方便起见,您可以制作子类的遮罩图像和备用字体属性。

于 2011-02-16T15:35:49.740 回答