将 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 在重用时会失去高度?