2009-08-19 47 views
18

Có phương pháp vẽ văn bản ở giữa hình chữ nhật hay không. Tôi có thể tìm thấy nhiều sắp xếp khác nhau, nhưng không có gì tôi đã cố gắng có thể theo chiều dọc trung tâm văn bản trong một rect.iPhone - Cách vẽ văn bản ở giữa một hình vuông

Có phương pháp đơn giản để thực hiện việc này hay có cách nào để căn giữa hình chữ nhật và sau đó vẽ hình đó?

Tôi đang vẽ trực tiếp đến CGContext, cố gắng sử dụng NSString :: drawWithRect hoặc một cái gì đó tương tự, vì tôi thực sự không muốn thêm Nhãn chỉ để hiển thị một số văn bản cơ bản.

Trả lời

29

Vâng, font sở hữu pointSize tương ứng trực tiếp với chiều cao bằng pixel của một NSString rút ra trong UIFont đó, vì vậy công thức của bạn sẽ là một cái gì đó như thế này:

- (void) drawString: (NSString*) s 
      withFont: (UIFont*) font 
      inRect: (CGRect) contextRect { 

    CGFloat fontHeight = font.pointSize; 
    CGFloat yOffset = (contextRect.size.height - fontHeight)/2.0; 

    CGRect textRect = CGRectMake(0, yOffset, contextRect.size.width, fontHeight); 

    [s drawInRect: textRect 
     withFont: font 
    lineBreakMode: UILineBreakModeClip 
     alignment: UITextAlignmentCenter]; 
} 

UITextAlignmentCenter xử lý các horizontal định tâm, vì vậy chúng tôi sử dụng chiều rộng đầy đủ của contextRect. Các lineBreakMode có thể được bất cứ điều gì bạn thích.

+0

Điều này rất gần với những gì tôi cuối cùng đã làm. Cảm ơn – Xetius

+3

Bạn luôn được chào đón. Bạn đã thay đổi điều gì, nếu tôi có thể hỏi? – Amagrammer

+6

Xin chào, tôi biết điều này khá cũ nhưng tôi đã sử dụng nó và phải thực hiện thay đổi. Thay đổi của tôi là dòng CGRect textRect .... Tôi đã thay đổi nó thành ... CGRect textRect = CGRectMake (contextRect.origin.x, contextRect.origin.y + yOffSet, contextRect.size.width, fontHeight); – Fogmeister

2

Trong iOS 6, bạn nhận được chuỗi được phân bổ và sắp xếp đoạn văn, do đó, điều này trở nên đơn giản hơn và mạnh mẽ hơn. Trong ví dụ này, chúng ta vẽ một lớn màu đỏ "A" ở giữa một hình chữ nhật:

NSMutableParagraphStyle* p = [NSMutableParagraphStyle new]; 
p.alignment = NSTextAlignmentCenter; 
NSAttributedString* bigA = 
    [[NSAttributedString alloc] initWithString:@"A" attributes:@{ 
     NSFontAttributeName: [UIFont fontWithName:@"Georgia" size:100], 
     NSForegroundColorAttributeName: [UIColor redColor], 
     NSParagraphStyleAttributeName: p 
    }]; 
[bigA drawInRect:CGRectMake(0,0,200,200)]; 
+3

Điều đó căn giữa văn bản theo chiều ngang, nhưng không căn chỉnh theo chiều dọc. – Clay

+0

"Sắp xếp theo chiều dọc"? Chỉ cần vẽ nó ở nơi bạn muốn. Hoặc vẽ nó vào một cái gì đó (ví dụ như một hình ảnh) và đặt nó ở nơi bạn muốn. – matt

+8

Đúng - Tôi hiểu những gì bạn đang nói. Tôi chỉ đang cố gắng chỉ ra rằng tôi nghĩ rằng câu hỏi là về cách sắp xếp thứ gì đó theo chiều dọc ở trung tâm của cái gì đó lớn hơn. Ví dụ, bạn có thể sử dụng '[myString drawInRect: myRect]' hoặc một biến thể để định vị chuỗi tại trung tâm dọc của 'myRect'. Đối với ca cao, tôi làm điều đó bằng cách bao gồm danh mục "NS (Attributed) String + Geometrics' từ https://github.com/jerrykrinock/CategoriesObjC và thực hiện một phép toán đơn giản với' - (float) heightForWidth: (float) phương thức width'. – Clay

1

Tôi đồng ý với câu trả lời của amagrammer, ngoại trừ một sự thay đổi nhỏ: Tôi sử dụng font.lineSize để có được chiều cao thích hợp. Tôi cho rằng sizeWithFont sẽ cung cấp cho bạn các linesize cũng

+0

Tôi đồng ý với bạn, nhưng lineSize hoặc lineHeight? – damithH

0

tôi đã tìm thấy mã này hoạt động khá tốt:

NSString *text = @"A bit of text to draw"; 
UIFont *font = [UIFont systemFontOfSize:12]; 
CGRect textFrame = (CGRect) 
{ 
    .size.width = 150, 
    .size.height = 150, 
}; 
CGSize textSize = [text sizeWithFont:font constrainedToSize:textFrame.size lineBreakMode:NSLineBreakByWordWrapping]; 
CGRect newTextFrame = CGRectInset(textFrame, 0, (textFrame.size.height - textSize.height)/2); 
[text drawInRect:newTextFrame withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter]; 

Các văn bản, phông chữ và chứa khung có thể đến từ bất cứ nơi nào, vì vậy chỉ cần sử dụng cùng một dòng chế độ nghỉ khi bạn thực hiện phép tính và bản vẽ.

17

Đây là phiên bản cập nhật dành cho iOS7.0 +.

Tôi cũng đã cải thiện câu trả lời ở trên bằng cách sử dụng phương thức sizeWithAttributes: trả về giới hạn của văn bản cho phép bạn định vị chính xác văn bản trước khi vẽ. Điều này loại bỏ sự cần thiết phải hardcode bất kỳ điều chỉnh mà sẽ phá vỡ nếu bạn sử dụng một phông chữ kích thước khác nhau hoặc nếu bạn sử dụng một phông chữ khác nhau.

- (void) drawString: (NSString*) s 
      withFont: (UIFont*) font 
      inRect: (CGRect) contextRect { 

    /// Make a copy of the default paragraph style 
    NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
    /// Set line break mode 
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail; 
    /// Set text alignment 
    paragraphStyle.alignment = NSTextAlignmentCenter; 

    NSDictionary *attributes = @{ NSFontAttributeName: font, 
            NSForegroundColorAttributeName: [UIColor whiteColor], 
            NSParagraphStyleAttributeName: paragraphStyle }; 

    CGSize size = [s sizeWithAttributes:attributes]; 

    CGRect textRect = CGRectMake(contextRect.origin.x + floorf((contextRect.size.width - size.width)/2), 
           contextRect.origin.y + floorf((contextRect.size.height - size.height)/2), 
           size.width, 
           size.height); 

    [s drawInRect:textRect withAttributes:attributes]; 
} 
Các vấn đề liên quan