iOS開發的一些小技巧,持續更新。。。。(系列一)

20140326編程

一、判斷設備是3.5寸仍是4寸?數據結構

if ([[UIScreen mainScreen] currentMode].size.height == 480||[[UIScreen mainScreencurrentMode].size.height == 960)app

{框架

    //這是3.5寸的iPhone設備iphone

}字體

elseui

{編碼

    //這是4寸的iPhone設備spa

}線程

以前寫了好長時間代碼,忘了在3.5寸屏幕適配,今天一跑,發現控件的顯示有問題,須要經過代碼判斷下屏幕尺寸,而後作相應處理,可是我以爲這種代碼真的很差,又要適配不一樣的系統-iOS6和iOS7,又要適配不一樣的設備-iPad和iPhone,還要適配不一樣的尺寸。

二、Apple Mach-O Linker Error

今天寫從新打開Xcode,運行項目,忽然有21個Error,我覺得是Xcode抽風了,因此點擊菜單Product->Clean,覺得清理一下就OK了,悲劇的是從新編譯,仍是21個Error,這時我就緊張了,再次Clean之後,看着Xcode編譯的過程。你們確定都知道「Compling 100 of 200 files」這個編譯的提示進度條,我看編譯時候一直沒有報錯,而後開始了連接Link的過程,而後就報錯了,仔細看看錯誤,就是"Apple Mach-O Linker Error",就是說在連接的時候發生了錯誤,通常狀況下這是由於引用第三方庫時候沒有導入相對應的框架framework,或者是由於沒有自動添加某些.m文件到Complie File。

解決的方法:

點擊工程文件->Build Phases->Complie Sources添加沒有添加的.m文件,或者Build Phrases->Link Binary with Libraries,添加沒有導入的框架framework。

今天我出現這樣的錯誤其實不是由於以上這些緣由,而是由於個人項目當中有C++代碼以及一些複雜的框架和SDK,因此不能在模擬器上面運行,可是我開機時候忘了選擇真機調試,致使了Linker Error。固然你們若是遇到這種Apple Mach-O Linker Error,要仔細看看緣由,基本上改正的方法就是添加.m文件或者導入相關的Library。記住這個錯誤的緣由,之後就不用在重複地尋找解決方法。

20140327

三、設置Button在不一樣狀態下的圖片

今天看了看UI設計師給個人設計圖,Button有未點擊的背景圖片和點擊狀態下的圖片,使用代碼寫很簡單,咱們對於設置Button背景圖片的代碼確定瞭然於胸,

[btn setImage:[UIImage imageNamed:@"normal"] forState:UIControlStateNormal];

想要設置點擊狀態下的背景圖片,代碼以下,

[findBtn setImage:[UIImage imageNamed:@"selected"] forState:UIControlStateSelected];

按住Command點擊UIControlStateNormal關鍵字,能夠查看資源庫中對於Button不一樣狀態的定義,定義以下代碼,

typedef NS_OPTIONS(NSUInteger, UIControlState) {

    UIControlStateNormal       = 0,

    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set

    UIControlStateDisabled     = 1 << 1,

    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)

    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use

    UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use

};

你們有興趣能夠設置不一樣狀態看看是什麼效果,此處再也不囉嗦。

四、今天在使用xib編程時候,拖動xib中的UI空間到.h文件時候,有一個紅色警告「could not insert new outlet connection,Could not find any information of the class name xxxViewController」,我頭上一陣冷汗啊,這是第一次遇到這種問題,網上搜索了下,解決方法是,打開Finder,選擇菜單->前往文件夾->~/Library/Developer/Xcode/DerivedData/,把遇到問題的項目文件夾刪除,而後從新啓動Xcode,而後就OK了。我第一次刪除的時候,沒有解決這個問題,而後又回頭刪除了一下,重啓Xcode,再從新拖動UI空間到.h文件,一切都正常了。

五、如今的項目是手動內存管理,因此在引入第三方資源庫時候,不少資源庫更新之後都開始使用arc進行編碼,這樣就致使兩種代碼風格不一致,有的時候可能開發者也沒有注意到這些問題,反正用的時候也沒有報錯,就直接使用了;可是有的時候,由於arc編碼中用到了新的屬性修飾符,例如weak,這時候在手動管理內存的代碼中就不能編譯經過,報錯的內容就是:@synthesize of 'weak' property is only allowed in ARC or GC mode,這就是引入的arc代碼在項目中的衝突,有一種解決辦法就是把資源代碼中的weak修飾符改成assign,可是這種方法畢竟是把別人寫的代碼給改了,有的時候每每會出現閃退、崩潰的問題。

比較好的解決辦法就是項目配置文件->Build Phrases->Complie Files,找到出現問題的資源庫文件(好比weak修飾符所在的文件),雙擊Complie Files中的該文件,在空白行中寫入-fobjc-arc,這樣就能夠有效防止該衝突。反過來有的時候,在arc代碼中引入手動管理內存的代碼,咱們在Complie Files中爲新增的資源文件增長-fno-objc-arc,這樣就避免了手動管理內存的代碼在arc代碼中的衝突。

20140328

六、修改導航欄NavigationBar爲透明色

項目中有個需求就是要把導航欄設置爲透明色,這樣才能不遮擋整個背景圖片,咱們的UI設計需求就是導航欄部分也能看見背景圖片。這個需求看起來簡單,作起來難,不過仍是在stackoverflow找到了答案。解決方案點此連接,主要代碼就是

[self.navigationBar setBackgroundImage:[UIImage new]

                             forBarMetrics:UIBarMetricsDefault];

self.navigationBar.shadowImage = [UIImage new];

self.navigationBar.translucent = YES;//這一行不是關鍵性代碼,甚至是錯誤代碼,由於在iOS 6會形成一個bug

代碼意思你們都能看懂,主要設置NavigationBar背景圖片爲空、透明translucent爲YES。這種時候還有兩個問題,第一就是Status Bar(就是現實時間、電源信號的狀態欄)字體看不清了,這時候經過設置狀態欄Status Bar的風格爲默認的就能夠,

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

第二個問題是導航欄的字體顏色如今也看不清,經過下面的代碼能夠修改,

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:

                                                   [UIColor blackColor],UITextAttributeTextColor,

                                                   [UIColor whiteColor], UITextAttributeTextShadowColor,

                                                   [NSValue valueWithUIOffset:UIOffsetMake(-1, 0)], UITextAttributeTextShadowOffset, nil];

        [[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];

原文在stackoverflow,答案這樣描述了上述代碼的做用:經過UINavigationBar的setTitleTextAttributes,你能夠設置字體、顏色、偏移座標(offset)和陰影的顏色,經過調用UINavigationBar的類方法setTitleTextAttributes,就是默認設置了你整個應用程序中的導航欄的顯示效果。

20140329

七、NSIndexPath沒那麼恐怖

UITableView生命了一個NSIndexPath的類別,主要用來標識當前cell在tableView中的位置,該類別有section和row兩個屬性,前者標識當前cell初一第幾個section中,後者表明在該section中的第幾行。建立一個NSIndexPath的方法是,

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:0];

那麼建立這個變量有什麼用呢?一般狀況下,咱們在進行cell內容的插入、刪除和更新的時候須要用到,這時候NSIndexPath與NSMutableArray搭配使用,能夠完成插入、刪除。。等操做,例如

NSMutableArray *indexPaths = [[NSMutableArray alloc]init];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:2 inSection:0];

[indexPaths addObject:indexPath];

例如插入一個cell,使用下面的代碼,

[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];

[index release];

這種UI界面的更新操做,不要放到主線程中執行,由於會形成界面卡頓,要放在後臺線程執行。這裏只是寫了界面方面的操做,同時應該更新數據源,否則只插入cell,而不插入數據,會形成程序crush。

八、神祕的Bundle並不神祕

不少開源的代碼中都能看見Bundle的身影,裏面放了一些文件,例如圖片或者文本文件,我一直搞不懂它的做用是什麼。搜索了之後才知道:Bundle文件是爲了方便在iOS開發過程當中便便管理資源文件,好比kkgridview裏就把所須要的圖片文件所有放到一個bundle中來進行管理的。建立Bundle最簡單的方式就是,新建一個文件夾,例如MyBundle,在裏面放幾張圖片,而後將文件件後綴名改成.bundle,並拖動其至Xcode中。在代碼中使用Bundel中的文件方法是以下,

NSString *bundlePath = [[NSBundle mainBundle].resourcePath stringByAppendingPathComponent:@"MyBundle.bundle"];

NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

UIImage *(^getBundleImage)(NSString *) = ^(NSString *n) {

    return [UIImage imageWithContentsOfFile:[bundle pathForResource:n ofType:@"png"]];

};

UIImage *myImg = getBundleImage(@"iphone_52x52");

九、frame和bounds的區別

bounds是一塊相對於自身(0,0)的矩形區域,而frame是相對於父view的矩形區域,下面的內容是我經過NSLog輸出了bounds和frame的信息,

bounds.origin.x: 0.000000

bounds.origin.y: 0.000000

bounds.size.width: 140.000000

bounds.size.height: 140.000000

frame.origin.x: 6.000000

frame.origin.y: 9.000000

frame.size.width: 140.000000

frame.size.height: 140.000000

能夠看到,不論是bounds仍是frame,width和height是相同的;而(x,y)座標倒是不一樣的,由於bounds是相對於其自身的位置,因此(x,y)老是(0,0),frame是相對於父view的位置,因此不一樣於bounds。因此之後咱們獲取view的寬度和高度,bounds和frame的狀況是同樣的。

十、更加快捷的獲取view的寬度和高度

以前咱們是經過self.view.frame.size.width來獲取寬度,經過self.view.frame.size.height獲取高度。其實CGRect數據結構提供了更加快捷的方式,CGRectGetWidth(self.view.frame),或者CGRectGetWidth(self.view.bounds),參見上一條--從frame和bounds獲取的寬高是同樣的。一樣獲取高度,CGRectGetHeight(self.view.frame)。

下一篇:iOS開發的技巧,新的一篇,持續更新。。。(系列二)

相關文章
相關標籤/搜索