iOS開發(fā)的一些小技巧

20140326

你所需要的網(wǎng)站建設(shè)服務(wù),我們均能行業(yè)靠前的水平為你提供.標(biāo)準(zhǔn)是產(chǎn)品質(zhì)量的保證,主要從事網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、企業(yè)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計、品牌網(wǎng)站制作、網(wǎng)頁制作、做網(wǎng)站、建網(wǎng)站。創(chuàng)新互聯(lián)公司擁有實力堅強(qiáng)的技術(shù)研發(fā)團(tuán)隊及素養(yǎng)的視覺設(shè)計專才。

1、判斷設(shè)備是3.5寸還是4寸?

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

{

    //這是3.5寸的iPhone設(shè)備

}

else

{

    //這是4寸的iPhone設(shè)備

}

之前寫了好長時間代碼,忘了在3.5寸屏幕適配,今天一跑,發(fā)現(xiàn)控件的顯示有問題,需要通過代碼判斷下屏幕尺寸,然后做相應(yīng)處理,但是我覺得這種代碼真的不好,又要適配不同的系統(tǒng)-iOS6和iOS7,又要適配不同的設(shè)備-iPad和iPhone,還要適配不同的尺寸。

2、Apple Mach-O Linker Error

今天寫重新打開Xcode,運行項目,突然有21個Error,我以為是Xcode抽風(fēng)了,所以點擊菜單Product->Clean,以為清理一下就OK了,悲劇的是重新編譯,還是21個Error,這時我就緊張了,再次Clean以后,看著Xcode編譯的過程。大家肯定都知道“Compling 100 of 200 files”這個編譯的提示進(jìn)度條,我看編譯時候一直沒有報錯,然后開始了鏈接Link的過程,然后就報錯了,仔細(xì)看看錯誤,就是"Apple Mach-O Linker Error",就是說在鏈接的時候發(fā)生了錯誤,一般情況下這是因為引用第三方庫時候沒有導(dǎo)入相對應(yīng)的框架framework,或者是因為沒有自動添加某些.m文件到Complie File。

解決的方法:

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

今天我出現(xiàn)這樣的錯誤其實不是因為以上這些原因,而是因為我的項目當(dāng)中有C++代碼以及一些復(fù)雜的框架和SDK,所以不能在模擬器上面運行,但是我開機(jī)時候忘了選擇真機(jī)調(diào)試,導(dǎo)致了Linker Error。當(dāng)然大家如果遇到這種Apple Mach-O Linker Error,要仔細(xì)看看原因,基本上改正的方法就是添加.m文件或者導(dǎo)入相關(guān)的Library。記住這個錯誤的原因,以后就不用在重復(fù)地尋找解決方法。

20140327

3、設(shè)置Button在不同狀態(tài)下的圖片

今天看了看UI設(shè)計師給我的設(shè)計圖,Button有未點擊的背景圖片和點擊狀態(tài)下的圖片,使用代碼寫很簡單,我們對于設(shè)置Button背景圖片的代碼肯定了然于胸,

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

想要設(shè)置點擊狀態(tài)下的背景圖片,代碼如下,

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

按住Command點擊UIControlStateNormal關(guān)鍵字,可以查看資源庫中對于Button不同狀態(tài)的定義,定義如下代碼,

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

};

大家有興趣可以設(shè)置不同狀態(tài)看看是什么效果,此處不再啰嗦。

4、今天在使用xib編程時候,拖動xib中的UI空間到.h文件時候,有一個紅色警告“could not insert new outlet connection,Could not find any information of the class name xxxViewController”,我頭上一陣?yán)浜拱?,這是第一次遇到這種問題,網(wǎng)上搜索了下,解決方法是,打開Finder,選擇菜單->前往文件夾->~/Library/Developer/Xcode/DerivedData/,把遇到問題的項目文件夾刪除,然后重新啟動Xcode,然后就OK了。我第一次刪除的時候,沒有解決這個問題,然后又回頭刪除了一下,重啟Xcode,再重新拖動UI空間到.h文件,一切都正常了。

5、現(xiàn)在的項目是手動內(nèi)存管理,所以在引入第三方資源庫時候,很多資源庫更新以后都開始使用arc進(jìn)行編碼,這樣就導(dǎo)致兩種代碼風(fēng)格不一致,有的時候可能開發(fā)者也沒有注意到這些問題,反正用的時候也沒有報錯,就直接使用了;但是有的時候,因為arc編碼中用到了新的屬性修飾符,例如weak,這時候在手動管理內(nèi)存的代碼中就不能編譯通過,報錯的內(nèi)容就是:@synthesize of 'weak' property is only allowed in ARC or GC mode,這就是引入的arc代碼在項目中的沖突,有一種解決辦法就是把資源代碼中的weak修飾符改為assign,但是這種方法畢竟是把別人寫的代碼給改了,有的時候往往會出現(xiàn)閃退、崩潰的問題。

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

20140328

6、修改導(dǎo)航欄NavigationBar為透明色

項目中有個需求就是要把導(dǎo)航欄設(shè)置為透明色,這樣才能不遮擋整個背景圖片,我們的UI設(shè)計需求就是導(dǎo)航欄部分也能看見背景圖片。這個需求看起來簡單,做起來難,不過還是在stackoverflow找到了答案。解決方案點此鏈接,主要代碼就是

[self.navigationBar setBackgroundImage:[UIImage new]

                             forBarMetrics:UIBarMetricsDefault];

self.navigationBar.shadowImage = [UIImage new];

self.navigationBar.translucent = YES;//這一行不是關(guān)鍵性代碼,甚至是錯誤代碼,因為在iOS 6會造成一個bug

代碼意思大家都能看懂,主要設(shè)置NavigationBar背景圖片為空、透明translucent為YES。這種時候還有兩個問題,第一就是Status Bar(就是現(xiàn)實時間、電源信號的狀態(tài)欄)字體看不清了,這時候通過設(shè)置狀態(tài)欄Status Bar的風(fēng)格為默認(rèn)的就可以,

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

第二個問題是導(dǎo)航欄的字體顏色現(xiàn)在也看不清,通過下面的代碼可以修改,

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:

                                                   [UIColor blackColor],UITextAttributeTextColor,

                                                   [UIColor whiteColor], UITextAttributeTextShadowColor,

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

        [[UINavigationBar appearance] setTitleTextAttributes:navbarTitleTextAttributes];

原文在stackoverflow,答案這樣描述了上述代碼的作用:通過UINavigationBar的setTitleTextAttributes,你可以設(shè)置字體、顏色、偏移坐標(biāo)(offset)和陰影的顏色,通過調(diào)用UINavigationBar的類方法setTitleTextAttributes,就是默認(rèn)設(shè)置了你整個應(yīng)用程序中的導(dǎo)航欄的顯示效果。

20140329

7、NSIndexPath沒那么恐怖

UITableView生命了一個NSIndexPath的類別,主要用來標(biāo)識當(dāng)前cell在tableView中的位置,該類別有section和row兩個屬性,前者標(biāo)識當(dāng)前cell初一第幾個section中,后者代表在該section中的第幾行。創(chuàng)建一個NSIndexPath的方法是,

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

那么創(chuàng)建這個變量有什么用呢?通常情況下,我們在進(jìn)行cell內(nèi)容的插入、刪除和更新的時候需要用到,這時候NSIndexPath與NSMutableArray搭配使用,可以完成插入、刪除。。等操作,例如

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

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

[indexPaths addObject:indexPath];

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

[self.tableView insertRowsAtIndexPaths:indexPathswithRowAnimation:UITableViewRowAnimationAutomatic];

[index release];

這種UI界面的更新操作,不要放到主線程中執(zhí)行,因為會造成界面卡頓,要放在后臺線程執(zhí)行。這里只是寫了界面方面的操作,同時應(yīng)該更新數(shù)據(jù)源,不然只插入cell,而不插入數(shù)據(jù),會造成程序crush。

8、神秘的Bundle并不神秘

很多開源的代碼中都能看見Bundle的身影,里面放了一些文件,例如圖片或者文本文件,我一直搞不懂它的作用是什么。搜索了以后才知道:Bundle文件是為了方便在iOS開發(fā)過程中便便管理資源文件,比如kkgridview里就把所需要的圖片文件全部放到一個bundle中來進(jìn)行管理的。創(chuàng)建Bundle最簡單的方式就是,新建一個文件夾,例如MyBundle,在里面放幾張圖片,然后將文件件后綴名改為.bundle,并拖動其至Xcode中。在代碼中使用Bundel中的文件方法是如下,

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

NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

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

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

};

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

9、frame和bounds的區(qū)別

bounds是一塊相對于自身(0,0)的矩形區(qū)域,而frame是相對于父view的矩形區(qū)域,下面的內(nèi)容是我通過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)坐標(biāo)卻是不同的,因為bounds是相對于其自身的位置,所以(x,y)總是(0,0),frame是相對于父view的位置,所以不同于bounds。所以以后我們獲取view的寬度和高度,bounds和frame的情況是一樣的。

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

之前我們是通過self.view.frame.size.width來獲取寬度,通過self.view.frame.size.height獲取高度。其實CGRect數(shù)據(jù)結(jié)構(gòu)提供了更加快捷的方式,CGRectGetWidth(self.view.frame),或者CGRectGetWidth(self.view.bounds),參見上一條--從frame和bounds獲取的寬高是一樣的。同樣獲取高度,CGRectGetHeight(self.view.frame)。

分享名稱:iOS開發(fā)的一些小技巧
標(biāo)題URL:http://muchs.cn/article10/gpgjgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、ChatGPT、微信公眾號網(wǎng)站設(shè)計公司、響應(yīng)式網(wǎng)站、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)