1

在我的应用程序中,我需要在标签中的行文本下显示,因此我使用以下代码来显示带下划线的文本

NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:normalString];
    [attributeString addAttribute:NSUnderlineStyleAttributeName
                            value:[NSNumber numberWithInt:1]
                            range:(NSRange){0,[attributeString length]}];

wesiteAddressLabel.attributedText = attributeString;

此方法和其他一些在 iOS 6.1 中运行良好的实现

但是当我在 iOS 5.1 及以下版本中执行时,应用程序由于原因而崩溃,

[attributeString addAttribute:NSUnderlineStyleAttributeName
                            value:[NSNumber numberWithInt:1]
                            range:(NSRange){0,[attributeString length]}];

以前的版本不支持

所以我想使用respondsToSelector:方法来检查实例是否响应并为不支持的选择器实现另一种方法。

我如何使用这种方法?

4

2 回答 2

2

从文档中:

attributesText 标签显示的样式文本。

@property(nonatomic,copy) NSAttributedString *attributedText 讨论 该属性默认为 nil。为该属性分配一个新值也会用相同的字符串数据替换 text 属性的值,尽管没有任何格式信息。此外,分配一个新的值会更新字体、textColor 和其他与样式相关的属性中的值,以便它们反映从属性字符串中位置 0 开始的样式信息。

可用性 适用于 iOS 6.0 及更高版本。在 UILabel.h 中声明

您应该检查特定UIView元素是否能够响应attributedText. 在这种情况下:

[wesiteAddressLabel respondsToSelector:@selector(attributedText)];

应该够了

于 2013-07-18T08:16:14.063 回答
1

对于以前的版本,您必须UIImageView通过获取每行中文本的 with 和 Height 来在文本下方绘制一个。

或者您可以使用DrawRect方法创建一个标签类别。

    - (void)drawRect:(CGRect)rect
 {
  CGContextRef ctx = UIGraphicsGetCurrentContext();
  CGContextSetRGBStrokeColor(ctx, 0.0f/255.0f, 0.0f/255.0f, 255.0f/255.0f, 1.0f); // Your underline color
  CGContextSetLineWidth(ctx, 1.0f);

  UIFont *font = [UIFont systemFontOfSize:16.0f];
  CGSize constraintSize = CGSizeMake(MAXFLOAT, MAXFLOAT);
  CGSize labelSize;
  labelSize = [self.text sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];  

  CGContextMoveToPoint(ctx, 0, self.bounds.size.height - 1);
  CGContextAddLineToPoint(ctx, labelSize.width + 10, self.bounds.size.height - 1);

  CGContextStrokePath(ctx);

  [super drawRect:rect];  
}
于 2013-07-18T08:17:24.927 回答