以编程方式确定渲染的NSString维度和偏移量

时间:2013-04-16 17:25:40

标签: ios objective-c uilabel uifont

将此问题直接和尽可能多的信息框起来,以便给出明确的答案。甚至还有一张照片!

我有一个简单的UILabel子类(子类允许渲染描边文本)。

部首:

//  svCustomNumeralLabel.h

#import <UIKit/UIKit.h>

@interface svCustomNumeralLabel : UILabel

@property UIFont *customFont;
@property CGPoint drawPoint;

@end

完成实施:

#import "svCustomNumeralLabel.h"

@implementation svCustomNumeralLabel

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self initialize];
    }
    return self;
}


-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self initialize];
    }
    return self;
}


-(void)initialize{
    self.customFont =  [UIFont fontWithName:@"Forgotten Futurist" size:200.0];
    self.drawPoint = CGPointMake(-10.0,-39.0);

    float capHeight = self.customFont.capHeight;
    NSLog(@"Cap height: %f", capHeight);
}


- (void)drawRect:(CGRect)rect
{

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);//RGBA
    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);

    float descender = self.customFont.descender;
    float ascender = self.customFont.ascender;

    NSLog(@"Ascender: %f descender: %f", ascender, descender);

    CGSize frameSize = self.frame.size;
    NSLog(@"Frame width: %f height: %f", frameSize.width, frameSize.height);

    CGSize unDrawnSize = [self.text sizeWithFont:self.customFont];
    NSLog(@"Undrawn width: %f height: %f", unDrawnSize.width, unDrawnSize.height);

    CGSize drawnSize = [self.text drawAtPoint:self.drawPoint withFont:self.customFont];
    NSLog(@"Drawn width: %f height: %f", drawnSize.width, drawnSize.height);

}

我已将此类的实例放入Interface Builder中的UIViewsvCustomNumeralLabel的视图已在IB中手动调整为80.0宽度,127.0高度。

我已通过反复试验将self.drawPoint方法中initialize()的值设置为其当前值(-10.0, -39.0)

使用这些手动设置和硬连线值的结果是一个很好的数字,完全位于其容器框架内(为清晰起见,设置为灰色背景):svCustomNumeralLabel screengrab

上面运行的NSLog输出:

Cap height: 126.600006
Ascender: 165.601562 descender: -58.400002
Frame width: 80.000000 height: 127.000000
Undrawn width: 100.000000 height: 229.000000
Drawn width: 99.200005 height: 229.000000

我的问题

我怎么能以编程方式确定self.drawPoint的值来实现这个结果,即在正确的左上角呈现'0'字符?

次要问题:我如何为实际渲染的角色的精确宽度和高度计算正确的值,以便于在其视图中使其更好和舒适?

NSLog输出中可以看出,似乎很少有可用的信息与绘制的实际数字非常相似。与框架尺寸相关的唯一指标是UIFont.capHeight。似乎没有可靠的信息可用于确定(-10.0, -39.0)的{​​{1}}偏移值。

2 个答案:

答案 0 :(得分:0)

AppKit为Foundation Framework NSString提供了一些不错的补充:NSString UIKit Additions

特别感兴趣:- (CGSize)sizeWithFont:(UIFont *)font和相关方法。

答案 1 :(得分:0)