[iOS] UIAlertController 字體靠左
原生的UIAlertController字體靠中,看到高人hack出如何改變字體特性,終於豁然開朗呢!

只要會開車騎車的人,都會想知道現在的油價,現在中國石油開放資料可供串接,然而規格是我從來沒碰過的SOAP,這塊「肥皂」比起簡潔的JSON複雜多,於是我還要借助開源來幫我處理~
平台特性真的要好好瞭解一下,原來AngularJS有雙向資料繫結 (2-way Data Binding)的特性。
所謂雙向(2-way)是指controller與view兩邊對資料模型的操作,都會即時更新,使得controller與view兩邊的資料一致。
![[Ionic][AngularJS] 雙向資料繫結 (2-way Data Binding).png](https://cg2010studio.com/wp-content/uploads/2017/01/ionicangularjs-e99b99e59091e8b387e69699e7b9abe7b590-2-way-data-binding.png?w=540)
此圖解釋得相當直覺!
製作一個好的App有非常多因素,而其中使用者體驗非常重要,影響用戶是否會繼續使用我們的App。
原本以為Timer會固定時間就觸發,然而在多線程的狀況下並不是如此,因為每個事件都會被排程,假如前面執行事件會花長時間,就會影響原本我們預定時機點想觸發的Timer。
目前遇到的狀況:
手指滑動TableView,原本每秒執行的Timer卻不運作,直到放開手指。
原來把Timer加入到RunLoop就能解決問題!
程式碼這麼寫:
timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
果真它就如預期運行了!
iOS App幾乎少不了Navigation Bar,想要客製化Navigation Bar就要多些技巧,因為iOS SDK內建的功能有限(也許我沒發現XD~)。過去我們團隊常自己刻Navigation Bar,每一頁都拉介面設定,儘管麻煩還是依樣畫葫蘆,有時候某些頁面要呈現特別的樣子,就會慶幸我們使用非原生:P~
原生預設長得像下方圖⋯⋯

如果沒有特別設定,高度和顏色固定。
有些功能只能從系統設定App,那麼我們就必須知會使用者,若可以的話就導向系統設定App吧~

/**
Theme: Open Setting App
IDE: Xcode 8
Language: Objective C
Date: 105/12/28
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
-(void)pushSettingAction:(id)sender
{
if (/* DISABLES CODE */ (&UIApplicationOpenSettingsURLString) != nil) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
}
else {
DxLog(@"UIApplicationOpenSettingsURLString is not available in current iOS version");
}
}
這樣我就能導向原本App(以垃圾管家為例)的系統設定囉~
參考:How to open Settings programmatically like in Facebook app?。
現代人使用智慧手機已經脫離不了「相機」,於是許多應用需要取得本機相片 (Fetch Photos from Photo Library),我們開發者要怎麼做,才能輕易取得使用者珍貴的相片呢?

製作跟會員有關係的App,很常需要檢查Email格式 (Check Email Format),儘管知道這跟正規語言(Regular Language)有關係,但還是請高手幫我寫規則吧XD~
/**
Theme: Check Email Format
IDE: Xcode 8
Language: Objective C
Date: 105/11/14
Author: HappyMan
Blog: https://cg2010studio.wordpress.com/
*/
-(BOOL)isValidEmail:(NSString *)checkString
{
BOOL stricterFilter = NO; // Discussion http://blog.logichigh.com/2010/09/02/validating-an-e-mail-address/
NSString *stricterFilterString = @"^[A-Z0-9a-z\\._%+-]+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$";
NSString *laxString = @"^.+@([A-Za-z0-9-]+\\.)+[A-Za-z]{2}[A-Za-z]*$";
NSString *emailRegex = stricterFilter ? stricterFilterString : laxString;
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:checkString];
}
以後直接來這裡複製貼上吧~
在寫iOS Native App時早已知道視圖生命週期 (View Life Cycle)非常重要,因為它會決定我們接下來時做的流程。現在使用Ionic同樣也有視圖生命週期 (Ionic View Life Cycle),現在就稍微來瞭解其前後關係吧!

使用手機很常需要輸入文字,這時候虛擬鍵盤就會從螢幕底部升上來,因而擋住部分介面。在這裡iOS SDK並沒有自動調整介面,於是我們開發者每次就得自行處理,因為太常需要用到,於是就有高人寫的開源第三方套件IQKeyboardManager!
下載後匯入專案,不用寫任何一行程式,就能運行我們想要的功能!而且是每一頁面都預設套用,再也不用重複寫碼囉~
目前GitHub上有超過7000人打星。

HappyMan・迴響