2013-02-07 12 views
7

Tôi đang sử dụng phông chữ tùy chỉnh ở định dạng OpenType (.otf) và muốn sử dụng một số phông chữ OpenType Features.Truy cập các tính năng OpenType trong UIKit hoặc CoreText

Tôi làm cách nào để thực hiện điều này bằng UIKit hoặc CoreText? Tôi rõ ràng sẽ thích UIKit, nhưng nhìn vào UIFont, các tùy chọn là rất hạn chế.

Dường như hoàn toàn không có tài liệu liên quan đến hỗ trợ OpenType trên iOS, ngoại trừ định dạng phông chữ có thể được sử dụng.

Đọc liên quan: reference for OpenType features của Microsoft và một số thông tin về cách browsers are beginning to offer OpenType feature support. Mặc dù câu hỏi này là để hiển thị phông chữ với các tính năng OpenType trên iOS một cách tự nhiên.

Trả lời

7

Vì tất cả những gì tôi nghe là dế ở nơi văn bản lõi tối và đơn độc này, tôi nghĩ tôi sẽ đăng câu trả lời mà tôi tự tìm thấy.

Câu trả lời là UIKit không hỗ trợ cài đặt các tính năng OpenType trong khuôn khổ của nó (tại thời điểm viết), bạn phải thả xuống Core Text để làm điều đó, và may mắn là họ có API hiển thị thêm phông chữ Tính năng, đặc điểm.

Tôi sẽ không đi sâu vào chi tiết về việc sử dụng Văn bản cốt lõi để vẽ văn bản, nhưng ý tưởng liên quan là bạn sẽ cần có một CTFontDescriptorRef xác định tất cả các thuộc tính của phông chữ sẽ được sử dụng để vẽ văn bản của bạn.

Mã mẫu:

CTFontDescriptorRef fontDescriptorNoFeatures = CTFontDescriptorCreateWithNameAndSize((__bridge CFStringRef)self.font.fontName, pointSize); 

// Set up OpenType Attributes 
CFAllocatorRef defaultAllocator = CFAllocatorGetDefault(); 

int numberSpacing = kNumberSpacingType; 
int numberSpacingType = kMonospacedNumbersSelector; 

CFNumberRef numberSpacingId = CFNumberCreate(defaultAllocator, kCFNumberIntType, &numberSpacing); 
CFNumberRef monospacedNumbersSelector = CFNumberCreate(defaultAllocator, kCFNumberIntType, &numberSpacingType); 

CTFontDescriptorRef fontDescriptor = CTFontDescriptorCreateCopyWithFeature(fontDescriptorNoFeatures, numberSpacingId, monospacedNumbersSelector); 

CFRelease(fontDescriptorNoFeatures); 
CFRelease(numberSpacingId); 
CFRelease(monospacedNumbersSelector); 

Những điều chính tôi đang làm ở đây là tạo một bản sao, sử dụng CTFontDescriptorCreateCopyWithFeature(), của bộ mô tả font chữ bình thường với một tính năng bổ sung, trong OpenType nó được gọi là "hình dạng bảng" , nhưng trong Core Text, bạn sẽ truy cập tính năng này bằng cách sử dụng tính năng khoảng cách số (kNumberSpacingType) và đặt giá trị cho enum thích hợp được xác định trong <CoreText/SFNTLayoutTypes.h>.

Đối với khoảng cách số tính năng giá trị enum (đối với một số lý do họ gọi cho họ selectors!?!) Là:

enum { 
    kMonospacedNumbersSelector = 0, 
    kProportionalNumbersSelector = 1, 
    kThirdWidthNumbersSelector = 2, 
    kQuarterWidthNumbersSelector = 3 
}; 

Vì vậy, các Bí quyết là có được không phải là một trực tiếp one-to-one ánh xạ Các tính năng của OpenType đối với CoreText, nhưng dường như tất cả chúng đều ở đó, bạn sẽ chỉ cần trải qua nỗi đau khi xác định đối tượng địa lý bằng cách xem xét các hằng số được xác định trong <CoreText/SFNTLayoutTypes.h>.

Phần còn lại của cơn đau bây giờ là bạn phải vẽ văn bản bằng phông chữ này trong Văn bản chính, thay vì chế độ xem cấp cao hơn, nhưng có rất nhiều tham chiếu ngoài đó để thực hiện điều đó.

+0

Tôi biết đây là câu hỏi/câu trả lời thực sự cũ nhưng có thể đáng để kiểm tra https://developer.apple.com/videos/play/wwdc2016/803/ từ WWDC 2016 vì có các ví dụ về cách sử dụng các tính năng sử dụng 'UIFont' và sửa đổi một bộ mô tả hiện có. Xung quanh trang 216 của trang trình bày PDF. – liamnichols

+0

Core Text đã thêm hỗ trợ để tải các tính năng OpenType bằng cách sử dụng 'kCTFontOpenTypeFeatureTag' và' kCTFontOpenTypeFeatureValue', được định nghĩa là OS X 10.10+ và iOS 8.0+ trong tiêu đề Văn bản lõi. – andlabs

Các vấn đề liên quan