2015-12-28 19 views
6

Tôi đã cố gắng áp dụng kết hợp NSFontAttributes vào NSMutableAttributedString gần đây và tôi không thể tìm thấy giải thích kỹ lưỡng về cách thực hiện mà không xóa các thuộc tính khác.Làm cách nào để áp dụng in đậm và in nghiêng cho phạm vi NSMutableAttributedString?

Tôi đã tìm kiếm một bó, và thấy question này liên quan đến làm thế nào để làm điều đó với HTML, và sau đó question này về làm thế nào để tìm nơi văn bản đã được in đậm hoặc in nghiêng, nhưng không làm thế nào để thực sự làm điều đó .

Hiện nay, tôi cố gắng định dạng đốt như sau:

In nghiêng: [mutableAttributedString addAttribute: NSFontAttributeName value:[fontAttributes valueForKey:CXItalicsFontAttributeName] range:r];

Bold:[mutableAttributedString addAttribute:NSFontAttributeName value:[fontAttributes valueForKey:CXBoldFontAttributeName] range:r];

Trường hợp hằng CXItalicsFontAttributeNameCXBoldAttributeName trích xuất hai giá trị sau đây từ một từ điển tôn trọng:

UIFont *italicsFont = [UIFont fontWithName:@"Avenir-BookOblique" size:14.0f]; 
UIFont *boldFont = [UIFont fontWithName:@"Avenir-Heavy" size:14.0f]; 

Tôi biết điều này không phải là đúng cách để đi về định dạng, vì NSAttributedString standard attributes không bao gồm một ItalicsFontAttribute hoặc BoldFontAttribute, nhưng tôi không thể tìm thấy cách đúng để làm điều này. Bất cứ ai có thể giúp tôi?

Trả lời

4

Nếu bạn đang áp dụng từng đặc điểm (đậm hoặc nghiêng) riêng lẻ, bạn cần đảm bảo rằng phạm vi in ​​nghiêng và in nghiêng không chồng lên nhau hoặc một đặc điểm sẽ ghi đè lên đối tượng khác.

Cách duy nhất để áp dụng cả các đặc điểm in đậm in nghiêng cho một phạm vi là sử dụng phông chữ đậm và nghiêng và áp dụng cả hai đặc điểm cùng một lúc.

let str = "Normal Bold Italics BoldItalics" 

let font = UIFont(name: "Avenir", size: 14.0)! 
let italicsFont = UIFont(name: "Avenir-BookOblique", size: 14.0)! 
let boldFont = UIFont(name: "Avenir-Heavy", size: 14.0)! 
let boldItalicsFont = UIFont(name: "Avenir-HeavyOblique", size: 14.0)! 

let attributedString = NSMutableAttributedString(string: str, attributes: [NSFontAttributeName : font]) 
attributedString.addAttribute(NSFontAttributeName, value: boldFont, range: NSMakeRange(7, 4)) 
attributedString.addAttribute(NSFontAttributeName, value: italicsFont, range: NSMakeRange(12, 7)) 
attributedString.addAttribute(NSFontAttributeName, value: boldItalicsFont, range: NSMakeRange(20, 11)) 

enter image description here

+0

phương pháp này có vẻ không thực tế. Điều đó có nghĩa là tôi sẽ cần tạo nhiều kết hợp nhất có thể để thử và giải thích cho tất cả các trường hợp. Tôi đã hy vọng để tránh nó. – Micrified

+0

@Owatch Đây là [câu hỏi hỏi về liệt kê] (http://stackoverflow.com/q/14161254/4151918). Bạn vẫn sẽ cần phải xây dựng các phông chữ trên bay. Không có cách nào xung quanh đó. –

+0

Tôi đã chọn câu trả lời của bạn làm giải pháp trước đó vì tôi không thể tìm thấy bất kỳ giải pháp thay thế nào, nhưng từ đó đã tìm thấy thứ gì đó phù hợp hơn với những gì tôi đang tìm kiếm, vì vậy tôi đã xóa dấu kiểm. Tôi xin lỗi vì không nhất quán. – Micrified

4

Giải pháp tốt nhất cho vấn đề của tôi cho đến nay đã được tận dụng các lớp UIFontDescriptor để cung cấp cho tôi với cần thiết UIFont cho từng trường hợp tôi gặp phải.

Ví dụ, như tôi muốn sử dụng Avenir-Book như phông chữ chính của tôi với kích thước 14, tôi có thể tạo ra một UIFontDescriptor như sau:

UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:@"Avenir-Book" size:14.0f];

Tiếp theo, nếu tôi muốn có được chữ nghiêng, in đậm, hoặc kết hợp cả hai, tôi phải đơn giản để làm như sau:

NSString *normalFont = [[fontDescriptor fontAttributes]valueForKey:UIFontDescriptorNameAttribute]; 
NSString *italicsFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitItalic]fontAttributes]valueForKey:UIFontDescriptorNameAttribute]; 
NSString *boldFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]fontAttributes]valueForKey:UIFontDescriptorNameAttribute]; 
NSString *boldAndItalicsFont = [[[fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold | UIFontDescriptorTraitItalic]fontAttributes]valueForKey:UIFontDescriptorNameAttribute]; 

Và điều này thực sự tạo ra các phông chữ cần thiết khi in:

NSLog(@"Normal Font: %@ Size: %@\n",normalFont,[[fontDescriptor fontAttributes]valueForKey:UIFontDescriptorSizeAttribute]); 
NSLog(@"Italics Font: %@\n",italicsFont); 
NSLog(@"Bold Font: %@\n",boldFont); 
NSLog(@"Bold and Italics Font: %@\n",boldAndItalicsFont); 

Output:

Normal Font: Avenir-Book Size: 14 
Italics Font: Avenir-BookOblique 
Bold Font: Avenir-Black 
Bold and Italics Font: Avenir-BlackOblique 

Ưu điểm ở đây là tôi không còn cần phải tạo ra các loại font chữ riêng bản thân mình, và một phông chữ từ gia đình là đủ để làm như vậy.

3

Trong Swift và sử dụng một phần mở rộng:

extension UIFont { 

    func withTraits(_ traits: UIFontDescriptorSymbolicTraits) -> UIFont { 

     // create a new font descriptor with the given traits 
     if let fd = fontDescriptor.withSymbolicTraits(traits) { 
      // return a new font with the created font descriptor 
      return UIFont(descriptor: fd, size: pointSize) 
     } 

     // the given traits couldn't be applied, return self 
     return self 
    } 

    func italics() -> UIFont { 
     return withTraits(.traitItalic) 
    } 

    func bold() -> UIFont { 
     return withTraits(.traitBold) 
    } 

    func boldItalics() -> UIFont { 
     return withTraits([ .traitBold, .traitItalic ]) 
    } 
} 

Ví dụ:

if let font = UIFont(name: "Avenir", size: 30) { 
    let s = NSAttributedString(string: "Hello World!", attributes: [ NSFontAttributeName: font.italic() ]) 
    let t = NSAttributedString(string: "Hello World!", attributes: [ NSFontAttributeName: font.boldItalic()) ]) 
} 
Các vấn đề liên quan