Cập nhật: Tôi khuyên bạn nên bắt đầu bằng sự hiểu biết UIAppearance
API và xem chúng phù hợp với nhu cầu của bạn như thế nào. UIAppearance
là cách thuận tiện để cung cấp cách điệu mặc định tùy chỉnh của các thuộc tính của các điều khiển cụ thể ở nhiều cấp độ (ví dụ: toàn cầu hoặc theo ngữ cảnh).
câu trả lời ban đầu của tôi, trong đó có trước UIAppearance
's sẵn:
vì chúng ta đang làm việc với một đối tượng ngôn ngữ dựa ...
cho việc thực hiện, nó phụ thuộc về cách bạn muốn nó hoạt động/thực thi. khi việc triển khai trở nên không thuận lợi, tôi sẽ thường tạo một giao thức. bạn có thể sử dụng phương pháp lớp học hoặc các phương pháp dụ và đáng kể tối ưu hóa các loại để sử dụng vì bạn tạo ra màu sắc ít trung gian, phông chữ, hình ảnh, vv
một giao diện cơ bản có thể mang hình thức:
@protocol MONLabelThemeProtocol
- (UIFont *)labelFont;
- (UIColor *)labelTextColor;
- (UITextAlignment)labelTextAlignment;
// ...
@end
@protocol MONTableViewCellThemeProtocol
- (UIFont *)tableViewCellFont;
- (UIColor *)tableViewCellTextColor;
- (UIImage *)tableViewCellImage;
- (NSInteger)tableViewCellIndentationLevel;
- (CGFloat)tableViewCellIndentationWidth;
// ...
@end
sau đó một theme amalgamate đơn giản có thể được khai báo như thế này:
@interface MONAmalgamateThemeBase : NSObject
< MONLabelThemeProtocol, MONTableViewCellThemeProtocol >
{
@protected
/* labels */
UIFont * labelFont;
UIColor * labelTextColor;
UITextAlignment labelTextAlignment;
// ...
/* table view cells */
UIFont * tableViewCellFont;
UIColor * tableViewCellTextColor;
UIImage * tableViewCellImage;
NSInteger tableViewCellIndentationLevel;
CGWidth tableViewCellIndentationWidth;
// ...
}
@end
trong ví dụ này, amalgamate xác định thu khí và dealloc và dự kiến các lớp con để khởi tạo các biến ví dụ. bạn cũng có thể hỗ trợ khởi tạo lười nếu thời gian khởi tạo cao (ví dụ: sử dụng nhiều hình ảnh).
sau đó một chuyên môn hóa có thể mang hình thức:
@interface MONDarkTheme : MONAmalgamateThemeBase
@end
@implementation MONDarkTheme
- (id)init
{
self = [super init];
if (nil != self) {
labelFont = [[UIFont boldSystemFontOfSize:15] retain];
labelTextColor = [[UIColor redColor] retain];
// and so on...
}
return self;
}
// ...
@end
/* declare another theme and set it up appropriately */
@interface MONLightTheme : MONAmalgamateThemeBase
@end
sau đó chỉ cần tái sử dụng các trường hợp chủ đề (ví dụ MONDarkTheme) trong suốt ứng dụng phong cách hóa các quan điểm. nếu bạn có nhiều chủ đề hoặc chúng không tầm thường để xây dựng, thì bạn có thể muốn tạo một bộ sưu tập cho các chủ đề (trình quản lý chủ đề). các hỗn hợp cũng có thể mất một tham số, chẳng hạn như init với chủ đề nếu nhu cầu của bạn là đơn giản. bạn thậm chí có thể cấu hình các đối tượng để đăng ký thay đổi chủ đề, nếu bạn cần hỗ trợ cho các thay đổi động.
cuối cùng, bạn có thể tạo một applier chủ đề đơn giản để làm cho cuộc sống dễ dàng hơn - như vậy:
@interface UILabel (MONThemeAdditions)
- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme;
@end
@implementation UILabel (MONThemeAdditions)
- (void)mon_applyMONLabelTheme:(id<MONLabelTheme>)theme
{
assert(theme);
if (nil == theme) return;
self.font = [theme labelFont];
self.textColor = [theme labelTextColor];
self.textAlignment = [theme labelTextAlignment];
}
@end
Bạn có thể cần phải xem thư viện này. Nó hỗ trợ nhiều chủ đề/da trên bay. Hỗ trợ hình ảnh và màu sắc hiện tại. Hỗ trợ phông chữ sẽ được thêm vào trong tương lai. https://github.com/charithnidarsha/MultiThemeManager –