In Info.plist set 'View controller-based status bar appearance' as NO
In AppDelegate add
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
Reference :
http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7
2015年6月16日 星期二
2015年5月21日 星期四
[Apple Watch] 簡單開箱文
身為果迷的一員,當然不能錯過 Apple Watch 啦!
目前使用了1週,感覺良好,有了些作習上的改變。
-減少看 iPhone 的次數
-每天乖乖充電(6 Plus 不需要)
-三不五時拿起來看一下(看水母動一下好心情)
-戴著感覺很舒服(與小米手環&Jawbone相比)
-更常使用 Siri
-起來動一動的次數增加(因為Apple Watch的提醒)
-目前還少了許多app來發揮丫!(開發者商機?)
2014年10月24日 星期五
[iOS] How to detect iPhone 6 Plus screen size
簡單列出一下 iPhone 6 & iPhone 6 Plus 解析度:
iPhone 6(4.7"): 750w x 1334h @2x (in points: 375w x 667h)
iPhone 6 Plus(5.5"): 1242w x 2208h @3x (in points: 414w x 736h)
本來天真的以為要判斷是否為 iPhone 6 Plus 只要查看 w or h 即可,但發現用模擬器執行 NSLog 印出 [UIScreen mainScreen].bounds 發現竟然跟 iPhone 5(4") 的解析度相同為 640w x 1136h,代誌不是憨人所想的那樣,查了一下發現可以用 nativeScale 來判斷,程式碼如下所示:
- (BOOL)IsiPhone6Plus
{
if([[UIScreen mainScreen] respondsToSelector:@selector(nativeScale)])
{
// Nativescale is always 3 for iPhone 6 Plus
if([UIScreen mainScreen].nativeScale > 2.1)
return YES;
}
return NO;
}
Reference: http://stackoverflow.com/questions/25756087/detecting-iphone-6-6-screen-sizes-in-point-values
iPhone 6(4.7"): 750w x 1334h @2x (in points: 375w x 667h)
iPhone 6 Plus(5.5"): 1242w x 2208h @3x (in points: 414w x 736h)
本來天真的以為要判斷是否為 iPhone 6 Plus 只要查看 w or h 即可,但發現用模擬器執行 NSLog 印出 [UIScreen mainScreen].bounds 發現竟然跟 iPhone 5(4") 的解析度相同為 640w x 1136h,代誌不是憨人所想的那樣,查了一下發現可以用 nativeScale 來判斷,程式碼如下所示:
- (BOOL)IsiPhone6Plus
{
if([[UIScreen mainScreen] respondsToSelector:@selector(nativeScale)])
{
// Nativescale is always 3 for iPhone 6 Plus
if([UIScreen mainScreen].nativeScale > 2.1)
return YES;
}
return NO;
}
Reference: http://stackoverflow.com/questions/25756087/detecting-iphone-6-6-screen-sizes-in-point-values
2014年10月20日 星期一
[iOS] iOS 8 UIAlertController scrolling 小記
最近發現在 UIAlertController 的 message 如果太長會導致無法 scroll ,解決方法為設定 frame 即可。如下:
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title"
message:messageString
preferredStyle:UIAlertControllerStyleAlert];
alertController.view.frame = [[UIScreen mainScreen] applicationFrame];
Reference : http://stackoverflow.com/questions/24671833/uialertcontroller-uialertview-scrolling-on-ios-8
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Title"
message:messageString
preferredStyle:UIAlertControllerStyleAlert];
alertController.view.frame = [[UIScreen mainScreen] applicationFrame];
Reference : http://stackoverflow.com/questions/24671833/uialertcontroller-uialertview-scrolling-on-ios-8
2014年10月5日 星期日
[iOS] iOS 8 non-public API usage 解決方法 (持續更新...)
一直以來都知道 apple 會把使用 non-public API 的 app 給 reject,沒想到最近真的遇到了!
一開始 apple 很貼心給個指令供查詢,最近更新到使用 Application Loader 時就會提示 (佛心),免除到進入 in review 才被 reject 的痛苦!
這邊要記錄一下有 "不小心" 用到的 non-public API 列表:
NSURLRequest
+ (void)setAllowsAnyHTTPSCertificate:(BOOL)inAllow forHost:(NSString *)inHost;
用途:允許任何 cer 通過 https 的連線方式,可以改用 (AFNetworking) allowsInvalidSSLCertificate 設為 YES 即可。
一開始 apple 很貼心給個指令供查詢,最近更新到使用 Application Loader 時就會提示 (佛心),免除到進入 in review 才被 reject 的痛苦!
這邊要記錄一下有 "不小心" 用到的 non-public API 列表:
NSURLRequest
+ (void)setAllowsAnyHTTPSCertificate:(BOOL)inAllow forHost:(NSString *)inHost;
用途:允許任何 cer 通過 https 的連線方式,可以改用 (AFNetworking) allowsInvalidSSLCertificate 設為 YES 即可。
2014年9月27日 星期六
[iOS] iOS 8 Push Notification Service
iOS 8 為 Notification Center 帶來新功能,所以取得 token 的 api 也修改了,如下所示:
if(IS_IOS8)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationType)(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
if(IS_IOS8)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationType)(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
2014年9月26日 星期五
[iOS] iOS 8 用 UIAlertController 來取代原本的 UIAlertView & UIActionSheet
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@“title" message:@“message" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@“cancel"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action)
{
[alert dismissViewControllerAnimated:YES completion:nil];
}];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@“ok"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
[alert dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:cancelAction];
[alert addAction:okAction];
[self presentViewController:alert animated:YES completion:nil];
以下連結有更詳細的介紹:
http://useyourloaf.com/blog/2014/09/05/uialertcontroller-changes-in-ios-8.html
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@“cancel"
style:UIAlertActionStyleCancel
handler:^(UIAlertAction * action)
{
[alert dismissViewControllerAnimated:YES completion:nil];
}];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@“ok"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * action)
{
[alert dismissViewControllerAnimated:YES completion:nil];
}];
[alert addAction:cancelAction];
[alert addAction:okAction];
[self presentViewController:alert animated:YES completion:nil];
以下連結有更詳細的介紹:
http://useyourloaf.com/blog/2014/09/05/uialertcontroller-changes-in-ios-8.html
[iOS] iOS 8 進入 Settings 復活了
原本在 iOS 5.0 支援的終於在 iOS 8 又回來了,但目前只能進入 "Settings" 而己...
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
[iOS] iOS 7&8 UISearchBar 去除背景的方法
UISearchBar 在 iOS 的不同版本中,把 subviews 列出來看會發現 view 層次結構不同,而要去除背景主要是將 UISearchBarBackground 給 remove 掉,因此就要針對各個 iOS 的版本做點調整,如下所示:
for (UIView *view in self.searchBar.subviews)
{
iOS 7 以前:
if ([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")])
{
[view removeFromSuperview];
break;
}
iOS 7 含以後:
if ([view isKindOfClass:NSClassFromString(@"UIView")] && view.subviews.count > 0)
{
for (UIView *subView in view.subviews)
{
if ([subView isKindOfClass:NSClassFromString(@"UISearchBarBackground")])
{
[subView removeFromSuperview];
break;
}
}
}
}
for (UIView *view in self.searchBar.subviews)
{
iOS 7 以前:
if ([view isKindOfClass:NSClassFromString(@"UISearchBarBackground")])
{
[view removeFromSuperview];
break;
}
iOS 7 含以後:
if ([view isKindOfClass:NSClassFromString(@"UIView")] && view.subviews.count > 0)
{
for (UIView *subView in view.subviews)
{
if ([subView isKindOfClass:NSClassFromString(@"UISearchBarBackground")])
{
[subView removeFromSuperview];
break;
}
}
}
}
2014年8月28日 星期四
[iOS] Switching from http to https. Invalid certificate
常用一些第三方套件提供網路通訊時,如果 server 端為 https 需要做一些設定來排除如標題所提到的問題,主要是設定允許 certificate 存取:
@interface NSURLRequest(Private)
+(void)setAllowsAnyHTTPSCertificate:(BOOL)inAllow forHost:(NSString *)inHost;
@end
使用如下指令:
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[inURL host]];
如果是使用 AFNetworking 套件時再加入以下定義:(加在 .pch 檔內)
#ifdef DEBUG
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_
#endif
參考來源:http://stackoverflow.com/questions/12447318/switching-from-http-to-https-invalid-certificate
@interface NSURLRequest(Private)
+(void)setAllowsAnyHTTPSCertificate:(BOOL)inAllow forHost:(NSString *)inHost;
@end
使用如下指令:
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:[inURL host]];
如果是使用 AFNetworking 套件時再加入以下定義:(加在 .pch 檔內)
#ifdef DEBUG
#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_
#endif
參考來源:http://stackoverflow.com/questions/12447318/switching-from-http-to-https-invalid-certificate
[iOS] NSTimer 機制小記
常常在用 NSTimer 來設計一些延遲或重覆執行某個 func call,但如果有用到 touch 事件,如:圖片點擊,UIScrollView 滑動等,就會把該 fund call 暫停,直到 touch 結束才繼續執行。
這樣一來就有時間差的問題存在,問了 google 大大後得知有人分享解決方式,就是將 NSTimer 加到別的 RunLoopMode 即可。
在 NSTimer 初始化後加入以下指令:
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
參考來源:http://stackoverflow.com/questions/6684016/why-timer-stops-when-scrolling-in-uiwebview-iphone
這樣一來就有時間差的問題存在,問了 google 大大後得知有人分享解決方式,就是將 NSTimer 加到別的 RunLoopMode 即可。
在 NSTimer 初始化後加入以下指令:
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
參考來源:http://stackoverflow.com/questions/6684016/why-timer-stops-when-scrolling-in-uiwebview-iphone
2014年8月19日 星期二
[iOS] 畫個虛線
- (void)makeLineInImageView:(UIImageView *)imageView
{
UIGraphicsBeginImageContext(imageView.frame.size);
[imageView.image drawInRect:CGRectMake(0, 0, imageView.frame.size.width, imageView.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); //設定線條終點形狀
float lengths[] = {2, 2}; //第一個參數設定每個虛線寬度,第二個參數設定虛線的間隔
CGContextRef line = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(line, [UIColor grayColor].CGColor);
CGContextSetLineDash(line, 0, lengths, 2);
CGContextMoveToPoint(line, 0.0f, 0.0f); //開始畫線
CGContextAddLineToPoint(line, imageView.frame.size.width, 0.0f);
CGContextStrokePath(line);
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
}
{
UIGraphicsBeginImageContext(imageView.frame.size);
[imageView.image drawInRect:CGRectMake(0, 0, imageView.frame.size.width, imageView.frame.size.height)];
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); //設定線條終點形狀
float lengths[] = {2, 2}; //第一個參數設定每個虛線寬度,第二個參數設定虛線的間隔
CGContextRef line = UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(line, [UIColor grayColor].CGColor);
CGContextSetLineDash(line, 0, lengths, 2);
CGContextMoveToPoint(line, 0.0f, 0.0f); //開始畫線
CGContextAddLineToPoint(line, imageView.frame.size.width, 0.0f);
CGContextStrokePath(line);
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
}
2014年7月30日 星期三
[iOS] How To Disable AFNetworking Cache
最近使用 AFNetworking 來下載圖片,發現在上傳圖後至 back-end 後,再更新會有 cache 的問題,在此註記一下如何忽略 cache 問題。主要是將 cachePolicy 設為 NSURLRequestReloadIgnoringLocalAndRemoteCacheData 即可。
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:20];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url
cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
timeoutInterval:20];
2014年7月19日 星期六
[iOS] Custom UIAlertView for iOS 7
自從 iOS 7 開始,很多人說無法加入 custom view。
若要帶輸入框(UITextField)的話,雖然本身有提供好幾種模式,如:UIAlertViewStyleLoginAndPasswordInput (帳號&密碼)、UIAlertViewStylePlainTextInput (文字)等。
結果發現要做個重設密碼,需要2個 UITextField 且為 Secure 模式就無法度了,因為 UIAlertViewStyleLoginAndPasswordInput 其中有1個不是 Secure 模式。
拜讀 google 大神後找到好心人提供方法,去設定 UIAlertView 裡的 accessoryView 參數即可。
[alertView setValue:customContentView forKey:@"accessoryView"];
參考來源:http://stackoverflow.com/questions/18886048/ios-multiple-text-fields-on-a-uialertview-in-ios-7
若要帶輸入框(UITextField)的話,雖然本身有提供好幾種模式,如:UIAlertViewStyleLoginAndPasswordInput (帳號&密碼)、UIAlertViewStylePlainTextInput (文字)等。
結果發現要做個重設密碼,需要2個 UITextField 且為 Secure 模式就無法度了,因為 UIAlertViewStyleLoginAndPasswordInput 其中有1個不是 Secure 模式。
拜讀 google 大神後找到好心人提供方法,去設定 UIAlertView 裡的 accessoryView 參數即可。
[alertView setValue:customContentView forKey:@"accessoryView"];
參考來源:http://stackoverflow.com/questions/18886048/ios-multiple-text-fields-on-a-uialertview-in-ios-7
2014年7月18日 星期五
[iOS] Reaching the bottom of the UIScrollView
光陰似劍,研替3年快結束了!要轉職回小老百姓了說。
話說之前在使用 UIScrollView 來判斷是否 scroll 到底都用 scrollViewDidScroll 來判斷,今天發現另一個方法來實作,好處是可以減少一直呼叫丫!
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
float bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
if (bottomEdge >= scrollView.contentSize.height)
{
// we are at the end
}
}
參考來源:http://stackoverflow.com/questions/6217900/uiscrollview-reaching-the-bottom-of-the-scroll-view
話說之前在使用 UIScrollView 來判斷是否 scroll 到底都用 scrollViewDidScroll 來判斷,今天發現另一個方法來實作,好處是可以減少一直呼叫丫!
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
float bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height;
if (bottomEdge >= scrollView.contentSize.height)
{
// we are at the end
}
}
參考來源:http://stackoverflow.com/questions/6217900/uiscrollview-reaching-the-bottom-of-the-scroll-view
2014年4月21日 星期一
[iOS] 使用 ASIHTTPRequest 函式庫遇到 502 error 處理小記
目前在使用與伺服器溝通的第3方函式庫中,多數常用 ASIHTTPRequest 或 AFNetworking,而 ASIHTTPRequest 停止更新後,都改用 AFNetworking 比較多。最近在處理舊專案是使用 ASIHTTPRequest 時,突然出現了 Server Error
502 - Web server received an invalid response while acting as a gateway or proxy server 的錯誤訊息。
由於伺服器環境是使用微軟的 Azure WebSites,發生的原因是 Azure 無法處理 user-agent 的問題導致,解決方法是設定一下 user-agent 即可,如:[ASIHTTPRequest setDefaultUserAgentString:@"MyApp 1.0"]。
502 - Web server received an invalid response while acting as a gateway or proxy server 的錯誤訊息。
由於伺服器環境是使用微軟的 Azure WebSites,發生的原因是 Azure 無法處理 user-agent 的問題導致,解決方法是設定一下 user-agent 即可,如:[ASIHTTPRequest setDefaultUserAgentString:@"MyApp 1.0"]。
2014年3月29日 星期六
[iOS] UITableViewCell 在 iOS 7 的分割線左邊少 20 個 pixel 補滿的方法小記
if([_tableView respondsToSelector:@selector(setSeparatorInset:)])
{
[_tableView setSeparatorInset:UIEdgeInsetsZero];
}
{
[_tableView setSeparatorInset:UIEdgeInsetsZero];
}
2014年3月18日 星期二
[iOS] NSGenericException 錯誤小記
在使用 NSMutableArray 時,經常會對陣列中的元素做增減的動作,而在做元素刪除時,若有使用 foreach 來遍歷各個元素比對後刪減,就會發生 NSGenericException 的錯誤。
原因是只要在 foreach 裡做刪減時會將陣列的值全部失效,若剛好是最後一個值就沒問題,若不是即報錯誤。
解決方式提供2種,1種是一樣使用 foreach 做刪減,但完成後即 return 跳出。另1種是改用 for 迴圈即可。
原因是只要在 foreach 裡做刪減時會將陣列的值全部失效,若剛好是最後一個值就沒問題,若不是即報錯誤。
解決方式提供2種,1種是一樣使用 foreach 做刪減,但完成後即 return 跳出。另1種是改用 for 迴圈即可。
訂閱:
文章 (Atom)






