中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS開發的一些小技巧

發布時間:2020-08-03 08:16:10 來源:網絡 閱讀:703 作者:Im劉亞芳 欄目:移動開發

20140326

1、判斷設備是3.5寸還是4寸?

if ([[UIScreen mainScreencurrentMode].size.height == 480||[[UIScreenmainScreencurrentMode].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 sharedApplicationsetStatusBarStyle:UIStatusBarStyleDefault];

第二個問題是導航欄的字體顏色現在也看不清,通過下面的代碼可以修改,

NSDictionary *navbarTitleTextAttributes = [NSDictionary dictionaryWithObjectsAndKeys:

                                                   [UIColor blackColor],UITextAttributeTextColor,

                                                   [UIColor whiteColor], UITextAttributeTextShadowColor,

                                                   [NSValue valueWithUIOffset:UIOffsetMake(-10)],UITextAttributeTextShadowOffsetnil];

        [[UINavigationBar appearancesetTitleTextAttributes: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)。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

于都县| 中阳县| 密云县| 读书| 中卫市| 柘荣县| 扬中市| 濉溪县| 黔东| 象山县| 县级市| 迁安市| 安国市| 湖南省| 河间市| 枣阳市| 图片| 巴林左旗| 怀集县| 吐鲁番市| 石狮市| 桐梓县| 博湖县| 西乌珠穆沁旗| 密云县| 罗源县| 肇源县| 包头市| 盐池县| 雷州市| 芦溪县| 三河市| 丰都县| 崇明县| 山东| 上饶县| 交口县| 榕江县| 奈曼旗| 东兰县| 深泽县|