2010-03-30 26 views
36

Tôi đã tìm kiếm các tải đã tải và không thể tìm thấy câu trả lời.Làm thế nào để thay đổi khoảng cách chữ UILabel/UIFont?

Tôi có một UILabel bình thường, được xác định theo cách này:

UILabel *totalColors = [[[UILabel alloc] initWithFrame:CGRectMake(5, 7, 120, 69)] autorelease]; 
    totalColors.text = [NSString stringWithFormat:@"%d", total]; 
    totalColors.font = [UIFont fontWithName:@"Arial-BoldMT" size:60]; 
    totalColors.textColor = [UIColor colorWithRed:221/255.0 green:221/255.0 blue:221/255.0 alpha:1.0]; 
    totalColors.backgroundColor = [UIColor clearColor]; 
    [self addSubview:totalColors]; 

Và tôi muốn khoảng cách ngang giữa các chữ cái, để được chặt chẽ hơn, trong khi mantaining cỡ chữ.

Có cách nào để thực hiện việc này không? Nó phải là một điều khá cơ bản để làm.

Cheers guys, Andre

UPDATE:

Vì vậy, tôi đã buộc phải làm điều đó như thế này:

- (void) drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSelectFont (context, "Arial-BoldMT", 60, kCGEncodingMacRoman); 
    CGContextSetCharacterSpacing (context, -10); 
    CGContextSetTextDrawingMode (context, kCGTextFill); 

    CGContextSetRGBFillColor(context, 221/255.0, 221/255.0, 221/255.0, 221/255.0); 
    CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0); 
    CGContextSetTextMatrix(context, xform); 

    char* result = malloc(17); 
    sprintf(result, "%d", totalNumber); 

    CGContextShowTextAtPoint (context, 0, 54, result, strlen(result)); 
} 

Nhưng tôi cần phải sắp xếp này sang bên phải. Tôi có thể làm điều đó theo cách thủ công nếu tôi biết chiều rộng của văn bản được vẽ, nhưng điều đó chứng minh là gần như không thể tìm thấy điều đó.

Tôi đã đọc về ATSU, nhưng tôi không thể tìm thấy bất kỳ ví dụ nào.

Điều này hút:/

+0

thể trùng lặp của http://stackoverflow.com/questions/1063268/is-it -possible-to-alter-the-letter-khoảng cách-kerning-of-a-font-với-ca-cao-touch –

+0

vì vậy không có cách nào khác để làm điều đó mà không cần sử dụng phông chữ Tuỳ chỉnh hoặc không sử dụng Quartz 2D? – Andre

+1

Bạn có thể nhận được kích thước của khu vực văn bản sẽ chiếm trong một UILabel được gọi - (CGSize) sizeWithFont: (UIFont *) font minFontSize: (CGFloat) minFontSize actualFontSize: (CGFloat *) actualFontSize forWidth: (CGFloat) width lineBreakMode :(UILineBreakMode) phương thức lineBreakMode của NSString Category UIStringDrawing. Sau đó, bạn có thể giảm kích thước đó bằng cách bạn thu nhỏ văn bản của mình, tôi đoán vậy. Nếu bạn vẫn cần nó :) –

Trả lời

8

Tôi đã đưa ra giải pháp cho khoảng cách chữ cái và căn chỉnh ở bên phải.

Ở đây nó đi:

NSString *number = [NSString stringWithFormat:@"%d", total]; 

    int lastPos = 85; 

    NSUInteger i; 
    for (i = number.length; i > 0; i--) 
    { 
     NSRange range = {i-1,1}; 
     NSString *n = [number substringWithRange:range]; 

     UILabel *digit = [[[UILabel alloc] initWithFrame:CGRectMake(5, 10, 35, 50)] autorelease]; 
     digit.text = n; 
     digit.font = [UIFont fontWithName:@"Arial-BoldMT" size:60]; 
     digit.textColor = [UIColor colorWithRed:221/255.0 green:221/255.0 blue:221/255.0 alpha:1.0]; 
     digit.backgroundColor = [UIColor clearColor]; 
     [self addSubview:digit]; 

     CGSize textSize = [[digit text] sizeWithFont:[digit font]]; 
     CGFloat textWidth = textSize.width; 

     CGRect rect = digit.frame; 
     rect.origin.x = lastPos - textWidth; 
     digit.frame = rect; 

     lastPos = rect.origin.x + 10; 
    } 

Khoảng cách thư là "10" trên dòng cuối cùng. Căn chỉnh đến từ lastPos.

Hy vọng điều này sẽ giúp mọi người ở ngoài đó.

+3

Phương pháp của bạn là chính đáng (và cái đầu tiên xuất hiện trong tâm trí của tôi) nhưng tiếc là nó có thể không hoạt động tốt nếu bạn cần phải hiển thị nhiều vùng văn bản. Tôi nghĩ rằng bản cập nhật được cung cấp bởi Andre là tốt hơn nhiều trong trường hợp chung –

0

Không có trong bất kỳ phiên bản công khai nào có sẵn của hệ điều hành iPhone. ;-) Nếu bạn là một nhà phát triển iPhone hiện tại, bạn có thể có được một ý tưởng về nơi mà hệ điều hành iPhone đang đi bằng cách xem qua các ghi chú "Có gì mới" cho hệ điều hành iPhone 3.2.

Cập nhật: iOS v3.2, thêm hỗ trợ cho kerning, vẫn thuộc NDA khi tôi đăng nội dung này. Để biết câu trả lời cập nhật, hãy xem How to set kerning in iPhone UILabel.

+0

Vui lòng kiểm tra cập nhật của tôi. Bất kỳ ý tưởng? – Andre

+0

Bạn có thể xác định kích thước của văn bản được vẽ trong UILabel bằng textRectForBounds: restrictedToNumberOfLines :. Nghe có vẻ như bạn tìm thấy những gì bạn đang tìm kiếm, mặc dù! Tôi đã chỉ giả định bạn đang tìm kiếm kerning. Chúc mừng mã hóa! – Zack

+0

Tính đến thời điểm này phiên bản iOS hiện tại là 6.1. Cách để thực hiện điều này (dễ dàng) là sử dụng 'NSAttributedString', nhưng nó không có sẵn trong hầu hết các điều khiển cho đến khi iOS 6.0 – DBD

11

Tôi đã mở rộng UILabel để thay đổi khoảng cách ký tự. Điều này sẽ làm việc ra khỏi hộp và kéo phông chữ, văn bản, màu sắc vv từ chính UILabel (mã hóa thích hợp!).

Bạn có thể thấy tôi vẽ văn bản hai lần, trước tiên với màu sắc rõ ràng. Điều này là để tự động căn giữa văn bản trong nhãn. Trong khi điều này có thể không hiệu quả - không phải là nó tốt đẹp để được tự động làm trung tâm?

Tận hưởng!

@interface RALabel : UILabel { 
} 
@end 

@implementation RALabel 

- (void) drawRect:(CGRect)rect 
{ 

    // Drawing code 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSelectFont (context, [self.font.fontName cStringUsingEncoding:NSASCIIStringEncoding], self.font.pointSize, kCGEncodingMacRoman); 
    CGContextSetCharacterSpacing(context, 1); 
    CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]); 
    CGAffineTransform myTextTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f); 
    CGContextSetTextMatrix (context, myTextTransform); 

    // draw 1 but invisbly to get the string length. 
    CGPoint p =CGContextGetTextPosition(context); 
    float centeredY = (self.font.pointSize + (self.frame.size.height- self.font.pointSize)/2)-2; 
    CGContextShowTextAtPoint(context, 0, centeredY, [self.text cStringUsingEncoding:NSASCIIStringEncoding], [self.text length]); 
    CGPoint v =CGContextGetTextPosition(context); 

    // calculate width and draw second one. 
    float width = v.x - p.x; 
    float centeredX =(self.frame.size.width- width)/2; 
    CGContextSetFillColorWithColor(context, [self.textColor CGColor]); 
    CGContextShowTextAtPoint(context, centeredX, centeredY, [self.text cStringUsingEncoding:NSASCIIStringEncoding], [self.text length]); 

} 
+1

bạn chỉ có thể sử dụng các ký tự ascii với giải pháp này – Bastian

40

Từ iOS 6 bạn có thể sử dụng NSAttributedString in UILabel.

Trong chuỗi do bạn có thể sử dụng thuộc tính NSKernAttributeName để thiết lập thư khoảng cách

NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithString: @"Test test test test "]; 
[attrStr addAttribute:NSKernAttributeName value:@(4.0) range:NSMakeRange(0, attrStr.length)]; 

UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 300, 300, 100)]; 
label.attributedText = attrStr; 
+1

thanx để tiết kiệm thời gian của tôi :) (y) – ishhhh

3

Trong Swift:

let myTitle = "my title" 
let titleLabel = UILabel() 
let attributes: NSDictionary = [ 
    NSFontAttributeName:UIFont(name: "HelveticaNeue-Light", size: 20), 
    NSForegroundColorAttributeName:UIColor.whiteColor(), 
    NSKernAttributeName:CGFloat(2.0) 
] 
let attributedTitle = NSAttributedString(string: myTitle, attributes: attributes as? [String : AnyObject]) 

titleLabel.attributedText = attributedTitle 
titleLabel.sizeToFit() 
Các vấn đề liên quan