Sakurakit是一個輕巧且功能強大的圖書館,可用於切換主題或皮膚,靈感來自SwiftTheme和dknightversion 。它提供鏈條和功能性編程,這對於您的代碼更可讀。
中文介紹
對於演示,請看一下工作區中的iOS示例項目Sakurademo_oc。下載後,您需要運行pod install 。
sakura的意思是以下theme 。現在,櫻花為您的應用程序。
您的項目中有三種使用Sakurakit的方法:
使用Cocoapods
手動的
使用迦太基
Cocoapods是Objective-C的依賴項管理器,它可以自動化並簡化項目中使用第三方庫的過程。
Podfile
platform :ios, '8.0'
pod 'SakuraKit'
下載Repo的郵政編碼,然後只需將所有文件拖到Sakurakit文件夾中即可到達您的項目。
迦太基是一個分散的依賴管理器,可建立您的依賴關係並為您提供二進制框架。
您可以使用以下命令使用Homebrew安裝迦太基:
$ brew update
$ brew install carthage
要使用迦太基將Sakurakit集成到您的Xcode項目中,請在您的Cartfile中指定:
github "tingxins/SakuraKit"
運行迦太基以構建框架並將sakurakit.framework框架拖到Xcode項目中。
這是一個示例,為UIButton配置皮膚作為以下示例。
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
button.sakura
.backgroundColor(@"Home.buttonBackgroundColor")
.titleColor(@"Home.buttonTitleColor", UIControlStateNormal);
顯然,正如代碼所示。它只是為按鈕配置了皮膚的backgroundColor和titleColor 。如果您想為應用程序切換主題或皮膚。只需稱呼此API使用TXSakuraManager :
// name: name of a theme or skin.
// type: TXSakuraTypeMainBundle or TXSakuraTypeSandBox
+ (BOOL)shiftSakuraWithName:(TXSakuraName *)name type:(TXSakuraType)type;
對於上面的代碼行。您可能會被一些文字所困擾,例如Home.buttonBackgroundColor或Home.buttonTitleColor 。不用擔心,我們將重點介紹如何稍後逐步為Sakura設置個人資料。
現在,讓我們專注於個人資料。簡而言之,個人資料是管理項目中應用程序設置主題或皮膚的簡單方法。 (實際上,Sakura個人資料只是喜歡本地化您的應用程序。)
Sakurakit支持.json&.plist file格式。對於.json文件示例。您可能應該這樣進行配置:
{
"Home":{
"buttonBackgroundColor":"#BB503D",
"buttonTitleColor":"#4AF2A1"
}
}
如上所述,我們可以知道, Home.buttonBackgroundColor和Home.buttonTitleColor只是字典的KeyPath 。 Sakurakit始終從個人資料切換主題或您的應用中獲取價值,例如color/iconName/text/fontsize.eg
預防措施:
捆綁主題存在於您的應用程序捆綁包中。我們還稱之為本地主題。我們應該始終為應用程序配置默認主題。當然, Sakurakit可以按照以下步驟為您的應用添加多捆主題:
首先,創建[ SakuraName ] .json配置文件。確保SakuraName是您的主題名稱。例如,如果要添加一個名為typewriter的新捆綁主題,則應將相應的配置文件命名為Typewriter.json 。
接下來,為typewriter主題配置圖標。圖標的名稱需要與其他本地主題區分。例如。如果在默認主題中名為cm2_btm_icn_account的圖標,則應該像此cm2_btm_icn_account_xxx中命名typewriter主題中的相應圖標。
在第1和2步之後。您可以在AppDelegate中註冊所有本地Sakura主題。 (默認主題可以忽略。)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Coding ...
[TXSakuraManager registerLocalSakuraWithNames:@[@"typewriter"]];
// Coding ...
return YES;
}
此時,我們已經配置了所有捆綁主題。我們現在可以隨時切換到這些主題。例如。如果您想切換到指定的typewriter的指定捆綁主題。只需這樣稱呼API:
[TXSakuraManager shiftSakuraWithName:@"typewriter" type:TXSakuraTypeMainBundle];
沙盒主題,使用包含配置文件和圖標的文件夾的壓縮軟件包(.zip)。我們還稱為遠程主題。用戶可以通過服務器通過網絡下載。服務器可以上傳多個主題動態,然後用戶可以從應用程序下載。
關於遠程主題數據格式建議,舉一個例子:(fyi)
{
"name": "I'm a monkey",
"sakuraName": "monkey",
"url": "http:\image.tingxins.cnsakuramonkey.zip"
}
sakuraName是您的主題名稱。 url是櫻花主題的遠程URL地址。 (注意:如果Sakuraname字段通過了NIL,則相應主題的名稱默認為下載軟件包的名稱。)
下載遠程主題後,我們可以切換這樣的主題:
[TXSakuraManager shiftSakuraWithName:sakuraName type:TXSakuraTypeSandBox];
關於您的一些令人興奮的事情。 Sakurakit還提供了一些API,您可以使用這些API下載遠程主題。並支持Block和Delegate回調。很棒,對吧?當然,您還可以為遠程主題自定義自己的下載操作。
讓我們現在談談。
如果您想下載櫻花主題。您可以這樣調用下載任務塊API。顯示用例:
[[TXSakuraManager manager] tx_sakuraDownloadWithInfos:sakuraModel downloadProgressHandler:^(int64_t bytesWritten, int64_t totalBytesWritten, int64_t totalBytesExpectedToWrite) {
// Sakura theme download progress callback
} downloadErrorHandler:^(NSError * error) {
// Sakura theme download error callback
} unzipProgressHandler:^(unsigned long long loaded, unsigned long long total) {
// Unzip sakura theme compressed package progress callback
} completedHandler:^(id<TXSakuraDownloadProtocol> infos, NSURL * location) {
// completed callback
} ];
在此示例中, sakuraModel的對象符合TXSakuraDownloadProtocol 。您可以在DownloadSakuraController中查看Sakurademo_oc,以獲取更多詳細信息。
如果您想下載櫻花主題。您可以這樣調用下載任務委託API:
[[TXSakuraManager manager] tx_sakuraDownloadWithInfos:sakuraModel delegate:self];
實施您需要的委託方法。
// If download task of sakura theme is already exist or already exist in sandbox, this API will callback.
- (void)sakuraManagerDownload:(TXSakuraManager *)manager
downloadTask:(NSURLSessionDownloadTask *)downloadTask
status:(TXSakuraDownloadTaskStatus)status;
// completed callback
- (void)sakuraManagerDownload:(TXSakuraManager *)manager
downloadTask:(NSURLSessionDownloadTask *)downloadTask
sakuraInfos:(id<TXSakuraDownloadProtocol>)infos
didFinishDownloadingToURL:(NSURL *)location;
// Sakura download progress callback
- (void)sakuraManagerDownload:(TXSakuraManager *)manager
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite;
/** Reserved for future use */
- (void)sakuraManagerDownload:(TXSakuraManager *)manager
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes;
// Sakura theme download error callback
- (void)sakuraManagerDownload:(TXSakuraManager *)manager
sessionTask:(NSURLSessionTask *)downloadTask
didCompleteWithError:(nullable NSError *)error;
// Unzip sakura theme compressed package progress callback
- (void)sakuraManagerDownload:(TXSakuraManager *)manager
downloadTask:(NSURLSessionDownloadTask *)downloadTask
progressEvent:(unsigned long long)loaded
total:(unsigned long long)total;
您可以在AppDelegate中查看Sakurademo_oc,以獲取更多詳細信息。
如果您不想使用API下載Sakurakit提供的遠程主題,則可以自定義自己的Sakura主題下載操作。
顯示您想要的代碼:
// `sakuraModel` conform to `TXSakuraDownloadProtocol`. location is theme compressed package path that downloaded。
[[TXSakuraManager manager] tx_generatePathWithInfos:sakuraModel downloadFileLocalURL:location successHandler:^(NSString *toFilePath, NSString *sakuraPath, TXSakuraName *sakuraName) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
BOOL isSuccess = [SSZipArchive unzipFileAtPath:toFilePath toDestination:sakuraPath delegate:self];
// Note: Be sure that call this API to format theme path if you are customize your own download operation. otherwise, when switching theme you may be failed.
[TXSakuraManager formatSakuraPath:sakuraPath cleanCachePath:toFilePath];
dispatch_sync(dispatch_get_main_queue(), ^{
if (isSuccess) {
[TXSakuraManager shiftSakuraWithName:sakuraName type:TXSakuraTypeSandBox];
}
});
});
} errorHandler:^(NSError * _Nullable error) {
NSLog(@"errorDescription:%@",error);
}];
問:為什麼每個主題都有自己的個人資料?
答:因為圖標名稱以外的每個主題都是相同的,並且背景顏色不同,字體大小可能不相同。因此,除非您只想為圖標製作主題,否則每個主題都應具有自己的個人資料。
問:為什麼櫻花的名稱應與相應主題的配置文件名稱一致?
答:這只是我們的慣例。切換主題時,Sakurakit將通過主題名稱在本地或沙箱路徑中找到主題,使主題和個人資料名稱相同,您將減少一些不必要的工作量。
問:捆綁包和沙盒主題有什麼區別?
答:實際上。捆綁主題,我們稱之為本地主題。遠程主題也稱為沙盒主題。
問:Sakurakit有一個用Swift編寫的版本嗎?
答:不。如果您現在真的需要它。這是將Swift與Sakurakitoc一起使用的示例。 (Sakurakitocforswiftdemo)
絕對,如果您願意,您可以一直為該項目做出貢獻。
如果您需要幫助或提出一般性問題,則只需在微博或Twitter中的@tingxins ,您就可以訪問我的博客。
如果您發現一個錯誤,只需打開一個問題即可。
如果您有功能請求,請打開問題。
如果您想貢獻,請提供此存儲庫,然後提交拉動請求。
SakuraKit可根據MIT許可獲得。有關更多信息,請參見許可證文件。
歡迎遵循我對微信的官方帳戶。