您好,登錄后才能下訂單哦!
20140326
1、判斷設備是3.5寸還是4寸?
if ([[UIScreen mainScreen] currentMode].size.height == 480||[[UIScreenmainScreen] currentMode].size.height == 960)
{
//這是3.5寸的iPhone設備
}
else
{
//這是4寸的iPhone設備
}
之前寫了好長時間代碼,忘了在3.5寸屏幕適配,今天一跑,發現控件的顯示有問題,需要通過代碼判斷下屏幕尺寸,然后做相應處理,但是我覺得這種代碼真的不好,又要適配不同的系統-iOS6和iOS7,又要適配不同的設備-iPad和iPhone,還要適配不同的尺寸。
2、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
3、設置Button在不同狀態下的圖片
今天看了看UI設計師給我的設計圖,Button有未點擊的背景圖片和點擊狀態下的圖片,使用代碼寫很簡單,我們對于設置Button背景圖片的代碼肯定了然于胸,
[btn setImage:[UIImage p_w_picpathNamed:@"normal"] forState:UIControlStateNormal];
想要設置點擊狀態下的背景圖片,代碼如下,
[findBtn setImage:[UIImage p_w_picpathNamed:@"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
};
大家有興趣可以設置不同狀態看看是什么效果,此處不再啰嗦。
4、今天在使用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文件,一切都正常了。
5、現在的項目是手動內存管理,所以在引入第三方資源庫時候,很多資源庫更新以后都開始使用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
6、修改導航欄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
7、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:indexPathswithRowAnimation:UITableViewRowAnimationAutomatic];
[index release];
這種UI界面的更新操作,不要放到主線程中執行,因為會造成界面卡頓,要放在后臺線程執行。這里只是寫了界面方面的操作,同時應該更新數據源,不然只插入cell,而不插入數據,會造成程序crush。
8、神秘的Bundle并不神秘
很多開源的代碼中都能看見Bundle的身影,里面放了一些文件,例如圖片或者文本文件,我一直搞不懂它的作用是什么。搜索了以后才知道:Bundle文件是為了方便在iOS開發過程中便便管理資源文件,比如kkgridview里就把所需要的圖片文件全部放到一個bundle中來進行管理的。創建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的區別
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的情況是一樣的。
10、更加快捷的獲取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)。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。