将 UIStackView 中的 UILabel 背景更改为渐变色

Posted

技术标签:

【中文标题】将 UIStackView 中的 UILabel 背景更改为渐变色【英文标题】:Changing background of UILabels in UIStackView to gradient color 【发布时间】:2016-07-03 09:15:47 【问题描述】:

我是 ios 开发新手,我正在使用 UIStackView。 当我使用StoryBoard 创建两个UILabels 作为UIStackView 的子对象时,以下代码可以使每个UILabel 的渐变背景颜色正常工作。

UILabel *label;
for (int ii = 1; ii < 3; ii++) 
    label = [self.view viewWithTag:ii];

    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = label.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor yellowColor]CGColor], (id)[[UIColor grayColor]CGColor], nil];
    [label.layer insertSublayer:gradient atIndex:0];

    UILabel *newLabel = [[UILabel alloc] initWithFrame:label.bounds];
    newLabel.backgroundColor = [UIColor clearColor];
    newLabel.text = label.text;
    [label addSubview:newLabel];

但是当我使用下面的代码以编程方式创建两个 UILabels 时, 我上面用于制作每个UILabel 的渐变背景的代码不起作用,背景颜色保持白色。 有人可以帮我解决这个问题吗?

UILabel *myLabel;
myLabel = [[UILabel alloc] init];
[myLabel setText:@"text1"];
[myLabel setTag:1];
[stackView addArrangedSubview:myLabel];

myLabel = [[UILabel alloc] init];
[myLabel setText:@"text2"];
[myLabel setTag:2];
[stackView addArrangedSubview:myLabel];

【问题讨论】:

你能用上面的代码看到UIStackView中的标签吗? 是的,我可以看到标签,但是没有渐变背景。 【参考方案1】:

问题似乎出在标签边界上。以下代码添加了一个 UIStackView 并添加了几个带有渐变的 UILabel。

const int STACK_WIDTH = 200;
const int NUM_LABELS = 3;
const int LABEL_WIDTH = STACK_WIDTH / NUM_LABELS;

UIStackView* stack = [[UIStackView alloc] initWithFrame:CGRectMake(0, 0, STACK_WIDTH, 100)];
stack.axis = UILayoutConstraintAxisHorizontal;
stack.distribution = UIStackViewDistributionFillProportionally;
stack.alignment = UIStackViewAlignmentLeading;
stack.spacing = LABEL_WIDTH;
stack.backgroundColor = [UIColor greenColor];
[self.view addSubview:stack];

for(int i = 0; i < NUM_LABELS; i++)
    UIView* myLabelView = [[UIView alloc] initWithFrame:CGRectMake(i * LABEL_WIDTH, 0, LABEL_WIDTH, stack.frame.size.height)];

    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = myLabelView.bounds;
    gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor yellowColor]CGColor], (id)[[UIColor grayColor]CGColor], nil];
    gradient.startPoint = CGPointMake(0, 0);
    gradient.endPoint = CGPointMake(1, 0);
    [myLabelView.layer addSublayer:gradient];

    UILabel* myLabel = [[UILabel alloc] initWithFrame:myLabelView.bounds];
    myLabel.text = [NSString stringWithFormat:@"label: %d", i];
    [myLabelView addSubview:myLabel];

    [stack addArrangedSubview:myLabelView];

【讨论】:

当你这样做时, UILabel 的文本会被渐变覆盖。这就是为什么我使用添加新的 UILabel 作为其他 UILabel 的子视图 - 正如这篇帖子中所建议的那样:***.com/questions/4850149/… 是的,我的错误,我会编辑我的答案 - 你还有问题吗? 是的,我仍然有这个问题。 还是同样的问题吗?我再次更新了我的答案 - 它对你有用吗?也许您可以发布更多代码,例如您如何创建 UIStackView。 谢谢,它有效。看来关键在于设置间距....非常感谢。

以上是关于将 UIStackView 中的 UILabel 背景更改为渐变色的主要内容,如果未能解决你的问题,请参考以下文章

UIStackView 中的 UILabel 中的 CAGradientLayer

UITableViewCell 中的 UIStackView 与多行 UILabel

为啥 UIStackView 中的 UILabel 在重用时会失去高度?

UIStackView 中的多行 UILabel 问题

如何在 UIStackView IOS 中向 UILabel 添加前导填充

iOS:多行 UILabel 与水平 UIStackView 中的另一个 UILabel 大小错误