2011-10-29 23 views
7

Tôi muốn làm cho ứng dụng iPhone của mình có thể chuyển đổi giữa các giao diện (hoặc chủ đề thiết kế, hoặc giao diện, chẳng hạn như gỗ, kim loại, màu đất, nam, nữ, v.v ...).Làm thế nào để chuyển đổi giao diện (hoặc chủ đề thiết kế) trong ứng dụng iOS?

Tôi sẽ chuẩn bị một số bộ bao gồm hình ảnh cho nút và hình nền, âm thanh và màu văn bản, đồng thời cho phép người dùng quyết định bộ da họ muốn sử dụng bởi cài đặt ứng dụng.

Thực tiễn tốt nhất để thực hiện điều này là gì?

Điều kiện là:

  • Tôi muốn sử dụng giao diện Builder
  • tôi cần phải hỗ trợ iOS 3.1.3 và sau đó
  • Tôi muốn làm cho bộ da tải về từ Internet (Tôi không thể bó tất cả các giao diện trong ứng dụng, vì một bộ skin đòi hỏi nhiều hình ảnh và kích thước tệp ứng dụng có thể trở nên rất lớn nếu tôi làm như vậy ... Tôi cũng không muốn mã hóa bất kỳ thông tin nào về các skin cụ thể .)
  • Nếu da tùy chỉnh không chứa một hoặc một số thành phần, (chẳng hạn như hình ảnh o r tập tin âm thanh), tôi muốn nó sử dụng phần tử còn thiếu từ bộ da mặc định.
  • Tôi không muốn tạo tệp Nib cho từng làn da. Tệp Nib cho một màn hình sẽ là tệp duy nhất trong gói chính để bảo trì dễ dàng hơn.

Tôi đang nghĩ đến việc tạo một siêu lớp của tất cả UIViewControllers trong ứng dụng của tôi và ghi đè phần mà nó tải tệp Nib và thay vì tải từ gói chính, tải tài nguyên từ da được lưu vào thư mục Tài liệu ... nhưng tôi không biết cách thực hiện ... Hành vi mặc định của các phương thức tải Nib luôn tải tài nguyên từ gói chính và thông tin về tên tệp tài nguyên bị mất sau khi đọc ...: (

Cảm ơn trước sự giúp đỡ của bạn.

+1

Có giải thích rất kỹ về cách tạo ứng dụng iOS cho iOS tại đây: http://stackoverflow.com/questions/8919334/how-to-create-multiple-themes-skins-for-iphone-apps?rq= 1 Nó cũng giải thích làm thế nào để da một nib, đặc biệt. từ iOS 5. –

+1

Bạn có thể xem qua thư viện dưới đây https://github.com/charithnidarsha/MultiThemeManager –

Trả lời

4

Am không chắc chắn về thực hành tốt nhất .. Nhưng, nếu ứng dụng của bạn không đủ lớn, sau đó một plist cấu trúc cũng là của bạn người bạn.

Ban đầu, bạn có thể chọn: Chủ đề kim loại. Các nội dung sau nên giữ:

Bạn có Singleton ThemeManager hoặc chỉ cần dán NSDictionary vào một trong các Singletons của bạn nếu thích hợp.

Điểm đằng sau ThemeManager là ánh xạ giữa nội dung và chủ đề ..

Một số mẫu mã (bằng văn bản trực tiếp trên SOF .. Đừng để ý Cú pháp sai lầm):

#define kThemeMap(__x__) [[ThemeManager sharedManager] assetForCurrentTheme:__x__] 

... 

-(void)doUselessStuff { 
    UIImage* backgroundImage = [UIImage imageNamed:kThemeMap(@"FirstViewBG")]; 

    ... 

} 

//in the ThemeManager: 
//returns the appropriate name of the asset based on current theme 
-(NSString*)assetForCurrentTheme:(NSString*)asset { 
    //_currentTheme is an NSDictionary initialized from a plist. Plist can be downloaded, too. 
    NSString* newAsset = [_currentTheme objectForKey:asset]; 
    if(newAsset == nil) { 
     newAsset = [_defaultTheme objectForKey:asset]; 
    } 
    return asset; 
} 

//Let us assume the user selects Metal Theme somewhere .. Still coding ThemeManager: 
-(void)selectedNewTheme:(NSString*)newTheme { 
    //First, get the full path of the resource .. Either The main bundle, or documents directory or elsewhere.. 
    NSString* fullPath = ...; 
    self.currentTheme = [NSDictionary dictionaryWithContentsOfFile:fullPath]; 
} 

Các tập tin plist chỉ là một từ điển với chuỗi để chuỗi ánh xạ ... một cái gì đó như thế này:

//Default.plist 
@"FirstViewBG" : @"FirstViewBG_Default.png" 
@"SecondViewBG" : @"SecondViewBG_Default.png" 
@"WinSound"  : @"WinSound_Default.aiff" 

//Metal.plist 
@"FirstViewBG" : @"FirstViewBG_Metal.png" 
@"SecondViewBG" : @"SecondViewBG_Metal.png" 
@"WinSound"  : @"WinSound_Metal.aiff" 

Ngoài ra, bạn chỉ có thể lưu postfix, nếu đó là đủ tốt cho yo u .. Nhưng, nó sẽ yêu cầu thao tác chuỗi, bằng cách cắt phần mở rộng -> thêm hậu tố -> thêm phần mở rộng ..

Hoặc có thể biến nó thành tiền tố?

+0

Cảm ơn bạn rất nhiều vì câu trả lời và mã mô tả! Đây có thể là một giải pháp khả thi. :) – Taka

+0

Chỉ có lý do tôi ngần ngại thực hiện phương pháp này là bằng cách này tôi phải giữ thông tin dư thừa về tên tệp tài nguyên cả trong tệp Nib và Plist. Nó sẽ không chi phí nhiều mặc dù ... Tôi vẫn hy vọng rằng có một cách để đọc các tên tập tin tài nguyên trong quá trình tải Nib, và thêm postfix chủ đề cụ thể hoặc tiền tố vào tên tập tin trong quá trình ... Bất kỳ ý kiến? Nếu nó không dễ dàng hoặc không thể, tôi sẽ thực hiện phương pháp này. Cảm ơn. ;) – Taka

+0

aah .. Tôi thực sự không thể nghĩ ra cách để làm điều đó. Bạn phải liên kết chúng dưới dạng IBOutlets và tùy chỉnh chúng trong viewDidLoad;) – Mazyod

0

Bạn có thể tạo danh mục trên UIImage bằng hình ảnh được đặt trướcNamNam :, sử dụng hình ảnh tùy chỉnhNam: thay vì hình mặc định. Trong tùy chỉnh methord, chọn hình ảnh theo chủ đề.

+0

Cảm ơn bạn đã trả lời. Vâng, nó sẽ làm việc, nhưng tôi tin rằng nó không phải là một thực hành tốt để sử dụng Objective-C Thể loại để ghi đè một phương pháp. (Như đã thảo luận trong http://stackoverflow.com/questions/5272451/overriding-methods-using-categories-in-objective-c) Trong trường hợp đó, chúng ta có thể phân lớp UIImage để ghi đè lên imageNamed :, nhưng theo cách này chúng ta không thể sử dụng Interface Builder hiệu quả. – Taka

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