使 UILabel 看起来像 CSS display: inline

Posted

技术标签:

【中文标题】使 UILabel 看起来像 CSS display: inline【英文标题】:Make UILabel look like CSS display: inline 【发布时间】:2011-08-20 22:17:06 【问题描述】:

好的,这是我的问题。我有一组相当大的 UIButtons,它们将 UIImage 设置为背景。现在我想在这些按钮中添加标签。但我目前正在实施的设计使用“花哨”标签,其中标签的背景颜色是半透明的,并且会在文本周围折叠。

我的第一个想法是使用 UIWebview 来实现这一点并且它可以工作,但是添加大量 UIWebview 需要很长时间才能显示标签。

下一个解决方案是使用 UILabel,性能会好几倍。但是对于我的生活,我无法弄清楚如何让视觉风格与设计相匹配。

所以基本上我想让 UILabel 表现得像一个 html 元素,它具有 CSS 规则 display: inline;样式已定义。

这甚至可以通过 UILabel 的内置参数实现吗?如果没有,我可能会使用 UIWebView 解决方案,但使用 UILabel 的解决方案当然会更好。

这是一个截图,应该可以更好地解释它

顶部是默认 UILabel 的行为方式,底部是我希望它的行为方式。

【问题讨论】:

【参考方案1】:

您还没有完全描述您的文本所具有的风格,但在我看来,您想要一种“发光”效果。这可以使用 QuartzCore 在标签上产生阴影效果来完成。请注意,单个阴影通常不会这样做,因此这里有一个带有四个标签和四个阴影的示例:

for (int i = 0; i < 4; i++) 
    UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 280, 30)];
    [label setBackgroundColor:[UIColor clearColor]];
    [label setTextColor:[UIColor colorWithRed:1 green:1 blue:1 alpha:1]];
    [label setText:@"This is some glowing text"];
    [[label layer] setShadowColor:[[UIColor colorWithRed:1 green:1 blue:1 alpha:1] CGColor]];
    CGSize shadowOff = CGSizeMake(0, 0);
    if (i == 0) shadowOff = CGSizeMake(3, 3);
    else if (i == 1) shadowOff = CGSizeMake(3, -3);
    else if (i == 2) shadowOff = CGSizeMake(-3, -3);
    else if (i == 3) shadowOff = CGSizeMake(-3, 3);
    [[label layer] setShadowOffset:shadowOff];
    [[label layer] setShadowOpacity:0.5];
    [[label layer] setShadowRadius:3];
    [[label layer] setMasksToBounds:NO];
    [self.view addSubview:[label autorelease]];

显然,阴影不透明度、半径等可以修改为不同级别的“发光”。

【讨论】:

我试过了,也许我做错了什么,但这并不是我真正想要的,但感谢您的努力,如果我需要,我现在有一个解决方案来创建外发光一。【参考方案2】:

据我所知,这里有两点你需要弄清楚:

    要在 UILabel 中使用的文本的渲染大小。这可以用-[NSString sizeWithFont:] 计算。还有很多其他相关的方法。请参阅 NSString UIKit 添加参考。

    您需要做的第二件事是 UILabel 的背景颜色应该完美地折叠在文本周围。为此,您需要将可拉伸图像设置为 UILabel 的背景。见-[UIImage stretchableImageWithLeftCapWidth:topCapHeight:]。请参阅http://idevrecipes.com/2010/12/08/stretchable-images-and-buttons/ 了解可拉伸图像如何工作的示例。

【讨论】:

【参考方案3】:

我设法找到了一个几乎按预期工作的解决方案。它不会围绕所有单行折叠,但它会折叠文本周围的框,这对我来说已经足够了。

这是对我有用的最终代码:

UILabel *buttonTitle = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 176, 120)];
buttonTitle.text = @"Button text";
buttonTitle.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.65];
buttonTitle.textColor = [UIColor whiteColor];
buttonTitle.textAlignment = UITextAlignmentLeft;
buttonTitle.numberOfLines = 0;
buttonTitle.lineBreakMode = UILineBreakModeWordWrap;
buttonTitle.adjustsFontSizeToFitWidth = NO;
[buttonTitle sizeToFit];

【讨论】:

以上是关于使 UILabel 看起来像 CSS display: inline的主要内容,如果未能解决你的问题,请参考以下文章

如何根据自适应布局和情节提要使 uitableviewcell 中的 uilabel 相对于设备进行包装

CSS 使HTML按钮看起来像链接

UITableViewCell 中的 UILabel 约束横向变化

UILabel 有错误的框架。迅速

如何使 UITableView 的部分标题居中

css 使EZ家庭包装div的全宽看起来像行,而内容保持通常的宽度和居中,为中间行着色。