iOS開發(fā)的一些小技巧-創(chuàng)新互聯(lián)

20140326

10余年的鯉城網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整鯉城建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“鯉城網(wǎng)站設(shè)計(jì)”,“鯉城網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

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è)備

}

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

2、Apple Mach-O Linker Error

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

解決的方法:

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

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

20140327

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

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

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

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

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

按住Command點(diǎn)擊UIControlStateNormal關(guān)鍵字,可以查看資源庫中對(duì)于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編程時(shí)候,拖動(dòng)xib中的UI空間到.h文件時(shí)候,有一個(gè)紅色警告“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/,把遇到問題的項(xiàng)目文件夾刪除,然后重新啟動(dòng)Xcode,然后就OK了。我第一次刪除的時(shí)候,沒有解決這個(gè)問題,然后又回頭刪除了一下,重啟Xcode,再重新拖動(dòng)UI空間到.h文件,一切都正常了。

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

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

20140328

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

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

[self.navigationBar setBackgroundImage:[UIImage new]

                forBarMetrics:UIBarMetricsDefault];

self.navigationBar.shadowImage = [UIImage new];

self.navigationBar.translucent = YES;//這一行不是關(guān)鍵性代碼,甚至是錯(cuò)誤代碼,因?yàn)樵趇OS 6會(huì)造成一個(gè)bug

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

[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];

第二個(gè)問題是導(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è)置了你整個(gè)應(yīng)用程序中的導(dǎo)航欄的顯示效果。

20140329

7、NSIndexPath沒那么恐怖

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

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

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

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

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

[indexPaths addObject:indexPath];

例如插入一個(gè)cell,使用下面的代碼,

[self.tableView insertRowsAtIndexPaths:indexPathswithRowAnimation:UITableViewRowAnimationAutomatic];

[index release];

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

8、神秘的Bundle并不神秘

很多開源的代碼中都能看見Bundle的身影,里面放了一些文件,例如圖片或者文本文件,我一直搞不懂它的作用是什么。搜索了以后才知道:Bundle文件是為了方便在iOS開發(fā)過程中便便管理資源文件,比如kkgridview里就把所需要的圖片文件全部放到一個(gè)bundle中來進(jìn)行管理的。創(chuàng)建Bundle最簡(jiǎn)單的方式就是,新建一個(gè)文件夾,例如MyBundle,在里面放幾張圖片,然后將文件件后綴名改為.bundle,并拖動(dòng)其至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是一塊相對(duì)于自身(0,0)的矩形區(qū)域,而frame是相對(duì)于父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)卻是不同的,因?yàn)閎ounds是相對(duì)于其自身的位置,所以(x,y)總是(0,0),frame是相對(duì)于父view的位置,所以不同于bounds。所以以后我們獲取view的寬度和高度,bounds和frame的情況是一樣的。

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

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

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

本文名稱:iOS開發(fā)的一些小技巧-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article14/dsjode.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、服務(wù)器托管網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航、ChatGPT、微信公眾號(hào)

廣告

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

營銷型網(wǎng)站建設(shè)