UILabel在内容的左边和右边缘修剪斜体(斜)文字(iOS 6)

问题:
UILabel可以在左边缘和右边缘剪切斜体(斜)字符甚至脚本.以下屏幕截图显示问题.在左边缘,’j’的下降被剪切;在右边缘,’l’的上升器被剪掉.我意识到这是微妙的,并不是每个人都会关心(但是,这个问题会随着字体大小的增加而变得更糟).

以下是使用Zapfino(尺寸为22)的不太细微的例子.请注意,木星中的“j”看起来几乎像“i”:

在上面的示例中,标签的背景颜色为橙色,文本保持对齐,并且标签保持其固有内容大小.

这是UILabel的默认行为,它是iOS的多个版本的所有方式(所以我不期待苹果的修复).

我试过了
将标签的clipsToBounds属性设置为NO无法解决问题.我也知道我可以在标签上设置一个固定的宽度约束,使文本在后端更加空间.然而,固定宽度约束不会给出’j’,在上面的例子中,更多的空间.

我将使用利用自动布局和标签的alignmentRectInsets的解决方案来回答我自己的问题.

当文本保持对齐,标签保持其固有内容大小时,顶部标签显示UILabel的默认行为.底部标签是UILabel的简单(几乎平凡)的子类.底部标签不夹住’j’或’l’;相反,它给文本留有左右边缘呼吸的空间,而不会对齐文本(yuck).

虽然标签本身在屏幕上不显示对齐,但它们的文本确实显示为对齐方式;而且在IB中,标签实际上将它们的左边对齐,因为我重写了UILabel子类中的alignmentRectInsets.

以下是配置两个标签的代码:

#import "ViewController.h"
#import "NonClippingLabel.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *topLabel;
@property (weak, nonatomic) IBOutlet NonClippingLabel *bottomLabel;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *string = @"jupiter ariel";

    UIFont *font = [UIFont fontWithName:@"Helvetica-BoldOblique" size:28];

    NSDictionary *attributes = @{NSFontAttributeName: font};

    NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:string attributes:attributes];

    self.topLabel.attributedText = attrString;
    self.bottomLabel.attributedText = attrString;     
}

以下是NonClippingLabel子类的实现:

#import <UIKit/UIKit.h>

@interface NonClippingLabel : UILabel

@end

@implementation NonClippingLabel

#define GUTTER 4.0f // make this large enough to accommodate the largest font in your app

- (void)drawRect:(CGRect)rect
{
    // fixes word wrapping issue
    CGRect newRect = rect;
    newRect.origin.x = rect.origin.x + GUTTER;
    newRect.size.width = rect.size.width - 2 * GUTTER;
    [self.attributedText drawInRect:newRect];
}

- (UIEdgeInsets)alignmentRectInsets
{
    return UIEdgeInsetsMake(0, GUTTER, 0, GUTTER);
}

- (CGSize)intrinsicContentSize
{
    CGSize size = [super intrinsicContentSize];
    size.width += 2 * GUTTER;
    return size;
}

@end

没有编辑字体文件,不使用Core Text;只是使用iOS 6和自动布局的UILabel子类相对简单.

更新:

Augie发现我的原始解决方案阻止了多行文字的换行.我通过使用drawInRect:而不是drawAtPoint来修正这个问题:在标签的drawRect:方法中绘制文本.

这是一个截图:

顶级标签是普通香草UILabel.底部标签是NonClippingLabel,具有极限沟槽设置,以适应尺寸为22.0的Zapfino.两个标签都使用自动布局进行左右对齐.

翻译自:http://stackoverflow.com/questions/20985085/uilabel-clipping-italic-oblique-text-at-left-and-right-edges-of-content-ios

转载注明原文:UILabel在内容的左边和右边缘修剪斜体(斜)文字(iOS 6)