2012-07-03 17 views
13

Chúng tôi đã mở rộng UILabel để có thể áp dụng phông chữ và màu chuẩn cho mọi ứng dụng của một loại nhãn nhất định trong ứng dụng của chúng tôi. Ví dụ.Hiện tượng không có hiệu lực trên UILabels được tạo theo chương trình

@interface UILabelHeadingBold : UILabel 
@end 

Trong appdelegate của chúng tôi, chúng tôi áp dụng các phông chữ và màu sắc như thế này

[[UILabelHeadingBold appearance] setTextColor:<some color>]; 
[[UILabelHeadingBold appearance] setFont:<some font>]; 

Khi thêm một UILabel trong của XIB của chúng tôi, bây giờ chúng ta có thể chọn các lớp học để được loại UILabelHeadingBold, và nó hoạt động như mong đợi . Nhãn được hiển thị với phông chữ và màu sắc chính xác, như được chỉ định trong AppDelegate của chúng tôi.

Tuy nhiên, nếu chúng tôi tạo nhãn theo lập trình, ví dụ:

UILabelHeadingBold *headingLabel = [[UILabelHeadingBold alloc] initWithFrame:CGRectMake(10, 10, 100, 30)]; 
[self.mainView addSubview:headingLabel]; 

UILabel không nhận được phông chữ/màu mong muốn được áp dụng. Chúng ta phải áp dụng thủ công các thuộc tính này.

Có cách nào để làm cho UIAppearance có hiệu lực trên các phần tử giao diện người dùng được tạo lập trình, hay nó chỉ hoạt động khi được sử dụng trong XIB?

Trả lời

17

Từ tài liệu của Apple:

Để hỗ trợ xuất hiện tùy biến, một lớp học phải phù hợp với giao thức UIAppearanceContainer và phương pháp accessor liên quan phải được được đánh dấu bằng UI_APPEARANCE_SELECTOR.

Ví dụ trong UINavigationBar.h, tintColor được đánh dấu bằng UI_APPEARANCE_SELECTOR

@property(nonatomic,retain) UIColor *tintColor UI_APPEARANCE_SELECTOR; 

Nhưng trong UILabel.h bạn có thể thấy rằng textColorfont propertys không được đánh dấu với UI_APPEARANCE_SELECTOR nhưng bằng cách nào đó nó hoạt động khi được bổ sung trong giao diện Builder (theo tài liệu nó không nên làm việc ở tất cả).

+2

Nó * không * đôi khi làm việc cho UILabels tạo trong mã quá, nhưng kết quả không phù hợp, và hành vi khác nhau giữa iOS 5 và, bạn biết đấy. Vì vậy, không sử dụng 'UIAppearance' để tùy chỉnh' UILabel's –

+0

+1 cho thông tin, rằng tôi không phải là người duy nhất nhận được kết quả không phù hợp (đã cho tôi mã hóa giờ cho đến khi tôi tìm thấy bình luận của bạn). 1 cho giải pháp robert.wijas - mà tôi sử dụng ngay bây giờ - và mọi thứ đều ổn. – anneblue

14

Hack đơn giản đang làm việc cho tôi mà không có vấn đề gì là tạo một danh mục với trình thiết lập UIAppearance để sửa đổi các thuộc tính UILabel.

Tiếp theo ước UIAppearance Tôi tạo ra một phương pháp:

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes; 
{ 
    UIFont *font = [numberTextAttributes objectForKey:UITextAttributeFont]; 
    if (font) { 
     self.font = font; 
    } 
    UIColor *textColor = [numberTextAttributes objectForKey:UITextAttributeTextColor]; 
    if (textColor) { 
     self.textColor = textColor; 
    } 
    UIColor *textShadowColor = [numberTextAttributes objectForKey:UITextAttributeTextShadowColor]; 
    if (textShadowColor) { 
     self.shadowColor = textShadowColor; 
    } 
    NSValue *shadowOffsetValue = [numberTextAttributes objectForKey:UITextAttributeTextShadowOffset]; 
    if (shadowOffsetValue) { 
     UIOffset shadowOffset = [shadowOffsetValue UIOffsetValue]; 
     self.shadowOffset = CGSizeMake(shadowOffset.horizontal, shadowOffset.vertical); 
    } 
} 

Trong loại UILabel:

@interface UILabel (UISS) 

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes UI_APPEARANCE_SELECTOR; 

@end 

Tôi vẫn đang cố gắng tìm ra lý do tại sao các setter gốc không hoạt động.

+0

Chúng tôi tạo thuộc tính tùy chỉnh trong một phân lớp hoạt động với proxy xuất hiện. Ví dụ. một thuộc tính "titleLabelFont" để bọc thuộc tính titleLabel.font của UIButton. Nó cũng hoạt động cho các thuộc tính khác, chẳng hạn như bóng. –

+0

@robert +1 giải pháp rất hay. Đã cho tôi giờ mã hóa cho đến khi tôi tìm thấy câu trả lời của bạn. Cảm ơn vì điều đó. Bây giờ, mọi thứ hoạt động tốt (và đơn giản). – anneblue

+0

Giải pháp tuyệt vời, điều này cũng hoạt động tốt trên các chế độ xem khác, chẳng hạn như UIButton để đặt phông chữ titleLabel khi Apple không dùng phương thức setFont:. –

0

giải pháp @ robert.wijas hoạt động tuyệt vời!

Đối với iOS 7 trở lên tôi phải cập nhật quan trọng kể từ khi một ông sử dụng không được tán thành cho 7+:

- (void)setTextAttributes:(NSDictionary *)numberTextAttributes; 
{ 
    UIFont *font = [numberTextAttributes objectForKey:NSFontAttributeName]; 
    if (font) { 
     self.font = font; 
    } 
    UIColor *textColor = [numberTextAttributes objectForKey:NSForegroundColorAttributeName]; 
    if (textColor) { 
     self.textColor = textColor; 
    } 
    UIColor *textShadowColor = [numberTextAttributes objectForKey:NSShadowAttributeName]; 
    if (textShadowColor) { 
     self.shadowColor = textShadowColor; 
    } 
    NSValue *shadowOffsetValue = [numberTextAttributes objectForKey:NSShadowAttributeName]; 
    if (shadowOffsetValue) { 
     UIOffset shadowOffset = [shadowOffsetValue UIOffsetValue]; 
     self.shadowOffset = CGSizeMake(shadowOffset.horizontal, shadowOffset.vertical); 
    } 
} 
+0

Xin lưu ý rằng bạn không xử lý đúng thuộc tính NSShadowAttributeName; giá trị của nó là NSShadow. –

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