将此问题直接和尽可能多的信息框起来,以便给出明确的答案。甚至还有一张照片!
我有一个简单的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中的UIView
。 svCustomNumeralLabel
的视图已在IB中手动调整为80.0宽度,127.0高度。
我已通过反复试验将self.drawPoint
方法中initialize()
的值设置为其当前值(-10.0, -39.0)
。
使用这些手动设置和硬连线值的结果是一个很好的数字,完全位于其容器框架内(为清晰起见,设置为灰色背景):
上面运行的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}}偏移值。
答案 0 :(得分:0)
AppKit为Foundation Framework NSString
提供了一些不错的补充:NSString UIKit Additions
特别感兴趣:- (CGSize)sizeWithFont:(UIFont *)font
和相关方法。
答案 1 :(得分:0)
您可以在CGFont级别了解有关字体的所有信息:
在更深层次上,您可以使用核心文本: