2011-08-22 24 views
22

Phương pháp tạo kiểu được đề xuất cho ứng dụng iOS là gì? Ví dụ: nếu có nhiều nhãn hoặc chế độ xem văn bản, cách cập nhật kiểu/màu phông chữ tại một nơi sẽ cập nhật kiểu/màu ở tất cả các vị trí khác?Phương pháp tạo kiểu được đề xuất cho ứng dụng iOS là gì?

Tôi biết phân lớp phụ có thể là một cách ... có cách nào khác không?

+0

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 –

Trả lời

9

Bạn có thể nhập một tập tin tiêu đề chuẩn vào tất cả các bộ điều khiển của bạn với một số hằng số thiết lập để tạo kiểu tóc ... Ví dụ:

Styles.h

#define kFontSize 14 
#define kFontFamily @"Helevetica" 

khiển

#import "Styles.h" // at the top 

myLabel.font = [UIFont fontWithName:kFontFamily size:kFontSize]; 

Cá nhân tôi nghĩ rằng Trình tạo giao diện là cách tốt nhất để tạo kiểu, howe ver này trả lời câu hỏi của bạn trực tiếp.

+4

tôi sẽ không downvote nó nhưng ... nếu một trong những lựa chọn để đi rằng tuyến đường, khai báo bên ngoài như: 'extern const CGFloat MONDarkThemeFontSize;' và 'extern NSString * const MONDarkThemeFontName; 'thích hợp hơn' #define kShortName value' vì nhiều lý do. – justin

+0

Tôi thích vì tôi nghĩ đây là cách dễ nhất và phù hợp nhất với ứng dụng tôi đang làm việc. Cảm ơn Alex và @Justin. – Yogesh

+0

Đây không phải là một ý tưởng hay. – DexterW

3

Tương tự như ý tưởng của Alex, bạn có thể tạo ra một lớp tĩnh gọi ThemeManager:

typedef enum 
{ 
    defaultStyle, 
    redStyle, 
} ThemeStyles; 

@interface Level : NSObject 
{ 
    ThemeStyles currentTheme; 
} 

Tất cả các lớp có thể được theo chủ đề sẽ nhập khẩu ThemeManager. Sau đó, bạn có thể tạo các phương pháp như:

+ (UIColor*) fontColor; 

Các lớp khác sẽ gọi khi nào họ muốn có màu cho phông chữ. Sau đó, nếu bạn muốn thay đổi chủ đề, bạn có thể thực hiện fontColor như:

+ (UIColor*) fontColor 
{ 
    switch (currentTheme) 
    { 
     case defaultStyle: 
     return [UIColor blackColor]; 
     case redStyle: 
     return [UIColor redColor]; 
    } 
} 

Khi bạn muốn thay đổi chủ đề, bạn có thể có ThemeManager thực hiện một phương pháp như:

+ (void) changeTheme:(ThemeStyles)newTheme 
{ 
    currentTheme = newTheme; 
} 
6

Thẳng thắn mà nói, là tốt nhất cách để đi về việc này là sử dụng Interface Builder. Trong khi nó có vẻ tốt đẹp để thay đổi một hằng số một nơi nào đó trong mã và có toàn bộ phong cách ứng dụng thay đổi, nó không bao giờ khá hoạt động theo cách đó. Đây là lý do của tôi:

1) Nhà phát triển không viết mã giao diện cũng như trình tạo giao diện. Trình tạo giao diện là công cụ đã được tinh chỉnh, thử nghiệm và được xử lý trên năm. Nó cung cấp phông chữ, căn chỉnh văn bản, bóng tối, vv Nó tương thích ngược cho đến nay như xa như bạn muốn. Nó cung cấp một cách rất đơn giản cho bất kỳ số lượng các nhà phát triển và thiết kế để nhảy vào và làm việc trên một cái gì đó rất đơn giản.

2) Luôn có các trường hợp cạnh mà bạn sẽ phải tính đến. Chắc chắn, một hằng số đơn giản sẽ làm những gì bạn muốn hầu hết thời gian, nhưng cuối cùng bạn sẽ phải hack một cái gì đó ở đây và lẻn một cái gì đó trong đó. Mã giao diện "đơn giản" mà bạn đã viết để bắt đầu sẽ phát triển và phát triển và phát triển. Các nhà phát triển khác sẽ phải duy trì mã đó. Bạn sẽ phải duy trì mã đó. Bạn sẽ phải tập tin và sửa lỗi, chỉnh sửa, ngoại trừ điều đó, vv Nó chắc chắn sẽ trở thành một đống lộn xộn.

3) Bạn viết nhiều mã hơn, bạn càng viết nhiều lỗi hơn. Trình tạo giao diện dành cho việc xây dựng 'giao diện' của hầu hết các ứng dụng iOS. Sử dụng nó. Đừng quá thông minh.

LƯU Ý: Tôi hiểu rằng Trình tạo giao diện không thể làm mọi thứ cho tất cả các ứng dụng. Có những trường hợp mã hóa giao diện là giải pháp duy nhất. Câu trả lời này chỉ đơn giản là "thực hành tốt nhất" chung mà tôi sử dụng trong phần lớn ứng dụng của mình.

+2

+1. Chỉ cần tạo các ngòi riêng biệt với các kiểu khác nhau và tải lại chế độ xem. –

+1

Tuy nhiên, tôi gặp phải các ứng dụng bạn phải quản lý hoặc thiết kế giao diện người dùng thông qua Objective-C. Nó là tốt để biết làm thế nào để làm điều đó. – BlueConga

9

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 
+0

Tôi thích câu trả lời này, mặc dù nó khá cũ. Hiện tại, hiện tại chúng tôi có API UIAppearance như thế nào? – bandejapaisa

+0

@bandejapaisa tôi đã cập nhật câu trả lời của mình. có 105 lần xuất hiện của 'UI_APPEARANCE_SELECTOR' trong iOS7 - có đủ quyền kiểm soát cho nhu cầu của hầu hết các ứng dụng. nếu bạn cần thêm chi tiết hoặc kiểm soát bộ nhớ, thuộc tính, kiểu dáng hoặc chức năng của trình trợ giúp (thực sự, tôi chỉ mới bắt đầu với các khả năng ở đó), thì cách tiếp cận ở trên có thể cung cấp cho bạn tất cả các điều khiển có sẵn. tôi cũng thích nó bởi vì nó không nhất thiết là toàn cầu hay xâm nhập. tôi thấy cách tiếp cận tương tự, nhưng 'UIAppearance' nghiêng về phía tiện lợi, trong khi tôi nghiêng về phía sự kiểm soát. Ngoài ra, tôi có xu hướng viết UI ... – justin

+0

@bandejapaisa ... theo lập trình, vì vậy điều này có xu hướng là vấn đề lặp lại với địa phương cao (dễ áp ​​dụng và đẩy chủ đề xung quanh khi tất cả các chi tiết tồn tại ở cùng một nơi). nó trở nên khó khăn hơn khi chi tiết tồn tại ở nhiều nơi - khi bạn kết hợp các bảng phân cảnh, XIB và một số mã. iow, sẽ ít thuận tiện hơn để giới thiệu và áp dụng các chủ đề có lập trình này khi những thứ như khởi tạo được chuyển từ nguồn sang tải SB/XIB. trong trường hợp đó, bạn có thể ghi đè chỉ để áp dụng các chủ đề. – justin

1

tôi sử dụng plists. Ngay khi tôi bản địa hóa các chuỗi, tôi sử dụng thủ tục tương tự để thay đổi chủ đề. Tôi mã hóa một singleton tải một plist chủ đề hiện tại và một plist dự phòng. Sau đó, tôi thay thế tên của các tài nguyên bằng các phím và các hàm macro kéo tên tài nguyên thực từ singleton.

Nhược điểm: bạn phải đặt tài nguyên cho từng phần tử, không chỉ đặt nó trong NIB.
Ưu điểm: một khi bạn đã hoàn tất, hầu hết các chủ đề tiếp theo liên quan đến photoshop và textmate, không phải IB hoặc mã.

3

Bạn có thể sử dụng một khái niệm trừu tượng của bên thứ ba của UIAppearance:

Sử dụng một Storyboard có rất nhiều lợi ích, nhưng nhiều tùy chọn kiểu không khả dụng, không ít tùy chọn nhất là phông chữ tùy chỉnh. Nếu bạn muốn có giao diện người dùng được tùy chỉnh sâu, bạn sẽ cần một số mã kiểu để làm cho nó xảy ra.

0

Bạn có thể cần 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

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