IOS開發(fā)筆記

此貼會(huì)經(jīng)常更新添加新內(nèi)容,敬請(qǐng)關(guān)注!

首先給出iOS開發(fā)常用開源代碼和第三方庫:http://www.cocoachina.com/applenews/devnews/2013/0128/5622.html

視頻分享:

http://www.lanrenios.com/tutorials/basic/2012/1218/630.html

http://www.lanrenios.com/tutorials/basic/2013/0121/806.html

這是一個(gè)大神的博客,可以多多學(xué)習(xí):http://geeklu.com/

修改appid 信息:appleid.apple.com

蘋果開發(fā)者支持中心:40067108551

1、獲取info.plist文件內(nèi)容,名稱/版本號(hào)......

NSDictionary*progectInfo = [[NSBundlemainBundle]infoDictionary];

NSString*idst = [progectInfoobjectForKey:@"CFBundleIdentifier"]; ? ? ?// 獲取應(yīng)用標(biāo)識(shí)

Dlog(@"%@", idst);

2、NSLog宏定義

#ifdef DEBUG

#define Dlog(format, ...) NSLog(format, ##__VA_ARGS__)

#else

#define Dlog(format, ...)

#endif

3、UIImageView之上的UIButton默認(rèn)是不觸發(fā)事件的,加入一行代碼搞定:

UIImageView*bgView = [[UIImageViewalloc]initWithImage:[[UIImageimageNamed:@"sdf"]autorelease]];bgView.userInteractionEnabled=YES;

4、設(shè)置視圖不支持橫屏顯示,修改info-plist文件,直接上圖:

5、相冊(cè)照片選中后可以編輯大小/移動(dòng)位置,修改選擇器:

imagePicker.allowsEditing=YES; 接著在代理方法中這樣獲得修改后的照片: UIImage*editedImage = [infoobjectForKey:UIImagePickerControllerEditedImage];

6、當(dāng)我們的應(yīng)用需要支持中文國(guó)際化時(shí),比如打開相冊(cè),菜單都是中文的.可以在PROJECT下添加,添加中文支持后infoPlist.strings會(huì)自動(dòng)添加一個(gè)中文的空文件,直接上圖:

7、(1)顯示Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles YES

隱藏Mac隱藏文件的命令:defaults write com.apple.finder AppleShowAllFiles NO

操作完之后要強(qiáng)制退出Finder并從新啟動(dòng)。

(2)MAX刪除文件夾下的所有.svn文件

打開終端應(yīng)用;將準(zhǔn)備刪除的文件夾拖拽到終端,得到該文件夾的絕對(duì)路徑;

cd ?剛才得到的路徑,進(jìn)入該文件夾;

執(zhí)行 ?rm -rf `find . -type d -name .svn` 命令;

注意這個(gè)符號(hào) : “ ?` ?” ,在mac下先按 fn 鍵 再按 esc 下面的哪個(gè)鍵; 或則直接拷貝上面的命令

8、程序停止/間隔執(zhí)行:

(1)sleep(300);

(2)(1)[NSThread sleepForTimeInterval:5.0];

(3)[selfperformSelector:@selector(startupview)withObject:nilafterDelay:3];

9、隱藏iPhone通知欄

(1)application.statusBarHidden=YES;

(2)可以修改info.plist文件:

10、標(biāo)簽欄默認(rèn)高度是48寬度152(四個(gè)菜單時(shí)),TabBarItem的圖片尺寸是30X30,這個(gè)應(yīng)該是帶字的,不帶字@2x應(yīng)該是44比較好看,導(dǎo)航欄

/UISegmentedControl /?工具欄 / uitableviewcell的默認(rèn)高度都是44,狀態(tài)欄默認(rèn)高度是20.

11、UINavigationController和UITabBarController都是容器控制器,別打算給他們或他們的子類直接添加標(biāo)題等操作。

12、導(dǎo)航欄在不同的視圖控制器中隱藏和出現(xiàn)時(shí)會(huì)有黑色的條閃現(xiàn),解決方法:[self.navigationControllersetNavigationBarHidden:YESanimated:YES]; 不要用傳統(tǒng)的這個(gè)屬性設(shè)置self.navigationController.navigationBarHidden = YES。

13、今天遇到一個(gè)很有趣的問題,花費(fèi)了近一個(gè)小時(shí)才搞定。當(dāng)我們用UINavigationController壓入普通視圖控制器顯示UIWebView時(shí),網(wǎng)頁由于UINavigationBar的高度無法通過滑動(dòng)完全顯示,意思就是當(dāng)我把頁面滑動(dòng)到最低部網(wǎng)頁還是不能完全顯示,問題就出在導(dǎo)航欄的高度影響了。解決方案很怪異,我設(shè)置了UIWebView的高度減去導(dǎo)航欄高度就ok了,代碼如下:

CGRectrect = [UIScreenmainScreen].bounds;

_uiWebView= [[UIWebViewalloc]initWithFrame:CGRectMake(0,0, rect.size.width, rect.size.height-60)];

14、AudioServicesPlaySystemSound(1013); ?調(diào)用系統(tǒng)鈴聲。(1013只是其中一個(gè)聲音)

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); ?調(diào)用系統(tǒng)震動(dòng)

15、Unbalanced calls to begin/end appearance transitions for......這種錯(cuò)誤是某個(gè)視圖在切換時(shí),動(dòng)畫沒有結(jié)束又有新的動(dòng)畫即將開始,所以就出問題了,解決辦法之一是去掉動(dòng)畫。比如[self.navigationControllerpushViewController:zbarReaderanimated:NO]; 不用YES;

16、UILabel和UITextField,UITextView區(qū)別

UILabel 顯示的文本只讀,無法編輯,可以根據(jù)文字個(gè)數(shù)自動(dòng)換行;

UITextField 可編輯本文,但是無法換行,只能在一行顯示;當(dāng)點(diǎn)擊鍵盤上的return時(shí)會(huì)收到一個(gè)事件做一些事情

UITextView 可編輯文本,提供換行功能。textView.layer.cornerRadius=10;//設(shè)置圓角

其實(shí)這些控鍵是否可編輯,自己可以手動(dòng)設(shè)置。

17、ios編輯框隱藏鍵盤

(1)點(diǎn)擊編輯區(qū)域外隱藏鍵盤

UITapGestureRecognizer*tapGr = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(dismissKeyBoard)];

tapGr.cancelsTouchesInView=NO;

[self.navigationController.navigationBaraddGestureRecognizer:tapGr];

(2)鍵盤上面添加隱藏按鈕

UIToolbar* topView = [[UIToolbaralloc]initWithFrame:CGRectMake(0,0,320,30)];

[topViewsetBarStyle:UIBarStyleBlackTranslucent];

UIBarButtonItem* doneButton = [[UIBarButtonItemalloc]initWithTitle:@"隱藏鍵盤"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(dismissKeyBoard)];

NSArray* buttonsArray = [NSArrayarrayWithObjects:doneButton,nil];

[topViewsetItems:buttonsArray];

[textViewsetInputAccessoryView:topView];

18、當(dāng)需要一次創(chuàng)建很多個(gè)UILabel或者其他控鍵,如果他們的坐標(biāo)是有規(guī)律可循,就用循環(huán)創(chuàng)建。目前蘋果沒有提供一次創(chuàng)建多個(gè)屬性相同標(biāo)題不同的控鍵。

19、iOS開發(fā)之去除icon圖標(biāo)特效,陰影、反光

添加一個(gè)Icon already includes gloss effects并選擇yes,然后icon位置Prerendered搭鉤如下圖:

20、當(dāng)UITextField的內(nèi)容左對(duì)齊時(shí)太靠近左邊怎么辦?我們可以利用分類機(jī)制重寫UITextField的自帶方法:

新建文件名字叫UITextFieldCategory.h / .m共兩個(gè)文件

.h內(nèi)容如下:

@interfaceUITextField (textMath)

- (CGRect)editingRectForBounds:(CGRect)bounds;

- (CGRect)textRectForBounds:(CGRect)bounds;

@end

.m內(nèi)容如下:

#import"UITextFieldCategory.h"

@implementationUITextField (textMath)

//利用分類重寫UITextField的內(nèi)容布局方法

- (CGRect)editingRectForBounds:(CGRect)bounds

{

returnCGRectMake(bounds.origin.x+10.0f, bounds.origin.y, bounds.size.width, bounds.size.height);

}

- (CGRect)textRectForBounds:(CGRect)bounds

{

returnCGRectMake(bounds.origin.x+10.0f, bounds.origin.y, bounds.size.width, bounds.size.height);

}

@end

21、刷新、提示、進(jìn)度條實(shí)現(xiàn),有第三方庫非常方便MBProgressHUD,可以在github上下載,地址:https://github.com/jdg/MBProgressHUD

22、發(fā)送郵件功能可以使用SKPSMTPMessage第三方庫,注冊(cè)一個(gè)gmail帳號(hào)就可以直接發(fā)送郵件到你制定的郵箱(qq郵箱),需要倒入框架。

23、給iphone模擬器相冊(cè)保存圖片向ios模擬器里添加圖片的方法不止一種,這里介紹最簡(jiǎn)單的:打開模擬器后,用電腦的 Safari 瀏覽網(wǎng)頁,將需要的圖片拖到 iPhone 模擬器,模擬器就會(huì)自動(dòng)打開 Safari 瀏覽到這張圖片了。此時(shí)長(zhǎng)按圖片,在彈出的對(duì)話框里選擇保存就搞定了。

24、設(shè)置navigation上tablebar的barButtonItem顏色

self.navigationController.navigationBar.tintColor= [UIColorcolorWithRed:104/255green:189/255.0blue:227/255.0alpha:1];

25、創(chuàng)建手勢(shì)之后,在執(zhí)行了手勢(shì)選擇器后記得移出手勢(shì),特別是這個(gè)手勢(shì)添加到一個(gè)其他控制器也使用到的對(duì)象上:

tapGr= [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(dismissKeyBoard)];

[self.navigationController.navigationBarremoveGestureRecognizer:tapGr];

26、應(yīng)用添加評(píng)論打分,直接進(jìn)入appstore評(píng)分頁面鏈接(只要更換id就可以了):itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=331351772

27、點(diǎn)擊home鍵,讓程序再次點(diǎn)擊時(shí)重新打開程序。在Information Property List下找到“Application does not run in background”屬性,然后將這個(gè)值設(shè)置成YES。

28、ios應(yīng)用右上角添加小紅圈,如果值為0則去除紅圓圈。[UIApplicationsharedApplication].applicationIconBadgeNumber=2;

29、多線程注意事項(xiàng):

(1)UI創(chuàng)建和操作都在主線程執(zhí)行。(2)非主線程主要執(zhí)行耗時(shí)的大數(shù)據(jù)處理,或者是網(wǎng)絡(luò)加載過程。

(3)每個(gè)線程的內(nèi)存管理都由開辟內(nèi)存的線程管理。

(4)次線程最好用自動(dòng)內(nèi)存管理池管理內(nèi)存。

30、sendSynchronousRequest同步請(qǐng)求時(shí),如果使用post傳遞參數(shù),后臺(tái)用Java接收參數(shù),必須在客戶端設(shè)置參數(shù)類型:

[requestsetValue:@"text/xml"forHTTPHeaderField:@"Content-Type"]; 如果忘記這句代碼,后臺(tái)是無法獲取參數(shù)值的。

31、XCode中文亂碼

在Mac下用普通的文本編輯器(或者用word從新保存)打開源文件,全文復(fù)制粘貼回XCode 。粘貼時(shí)提示有不可表示字符,選擇重新保存成UTF-8即可。

32、部分文件設(shè)置或者取消arc機(jī)制:選中Targets--> 選擇 Build Phases --> 展開Compile Sources ?,我們看到第二列的名稱為:Compiler Flags雙擊你所要使用ARC的文件,并輸入-fobjc-arc即可添加arc,如果想讓使用ARC機(jī)制的代碼不使用ARC機(jī)制,只需要輸入-fno-objc-arc

33、CATransition移動(dòng)視圖或者淡入淡出效果經(jīng)常對(duì)UIImageView或其他視圖不其作用,此時(shí)就添加一層UIView視圖,動(dòng)畫加到UIView上,UIImageView加到這個(gè)UIView上就OK了。

34、linker command failed with exit code 1 (use -v to see invocation),這種錯(cuò)誤一般由兩種原因造成:

(1)Target-->Build Phases-->compile Sources中缺少了某個(gè).m文件,點(diǎn)擊+號(hào)導(dǎo)入進(jìn)來就可以了。

(2)Target-->Build Phases-->compile Sources中重復(fù)添加了多個(gè)相同的.m文件,刪掉多余的就可以了。

35、當(dāng)switch case的分支中定義了變量,就必須加大括號(hào),否則語法錯(cuò)誤。

36、xcode5基于iOS5.0而不是iOS7開發(fā)的話,添加百度地圖SDK時(shí)報(bào)錯(cuò),有個(gè)地方需要注意

37、UITextField最開始獲得的textField.text時(shí),不是@"",而是nil。被這問題搞了很長(zhǎng)時(shí)間,郁悶啊。

38、Objective-C內(nèi)存管理(iOS內(nèi)存管理)

(1) IOS對(duì)象一直都在堆上(重點(diǎn)啊)。

(2) 方法的參數(shù)識(shí)別:帶*星號(hào)的,是類指針變量,內(nèi)容在堆上,不帶星號(hào)的是普通局部變量在棧上。

(3) ARC中默認(rèn)的指針類型就是strong。

(4) 在默認(rèn)情況下,所有的實(shí)例變量(對(duì)象)和局部變量(對(duì)象)都是strong類型的。

(5) 只要某個(gè)對(duì)象被任一strong指針指向,那么它將不會(huì)被銷毀。如果對(duì)象沒有被任何strong指針指向,那么就將被銷毀。

(6) 在ARC機(jī)制作用下,當(dāng)某個(gè)對(duì)象被銷毀后,所有指向這個(gè)對(duì)象的weak指針將被置為nil,weak指針沒有實(shí)際指向?qū)ο蟆?/p>

(7) 相信無數(shù)的開發(fā)者都曾經(jīng)被指針指向已釋放對(duì)象所造成的EXC_BAD_ACCESS困擾過,使用ARC以后,不論是strong還是weak類型的指針,都不再會(huì)指向一個(gè)dealloced的對(duì)象,從根源上解決了意外釋放導(dǎo)致的crash。

(8) NSString *str0 = @"abc"; 和NSString *str1 = @"abc"; 都在靜態(tài)存儲(chǔ)區(qū)存儲(chǔ),此時(shí)的str0和str1指針比較是相等的。

39、UIlabel自動(dòng)換行,uilabel換行設(shè)置

//自動(dòng)折行設(shè)置

label.lineBreakMode?=?UILineBreakModeWordWrap;

label.numberOfLines?=0;

40、iOS系統(tǒng)默認(rèn)可以向程序中增加最多64個(gè)本地通知,本地通知目前只能按照時(shí)分秒、年月日提示,如果想按每?jī)商焯嵝岩淮?,就麻煩了。要判斷機(jī)器是不是支持本地通知,然后在為每一個(gè)通知指定一個(gè)標(biāo)識(shí),取消時(shí)會(huì)用。

41、有時(shí)應(yīng)用在啟動(dòng)時(shí)就會(huì)閃退,請(qǐng)查看你的以下方法中是否添加了耗時(shí)操作,比如網(wǎng)絡(luò)請(qǐng)求。

application:didFinishLaunchingWithOptions:

applicationWillResignActive:

applicationDidEnterBackground:

applicationWillEnterForeground:

applicationDidBecomeActive:

applicationWillTerminate:

上面所有這些方法,應(yīng)用只有有限的時(shí)間去完成處理。如果花費(fèi)時(shí)間太長(zhǎng),操作系統(tǒng)將終止應(yīng)用。

42、推薦一個(gè)xcode控件KSImageNamed,KSImageNamed是一款方便填寫圖片文件名稱的插件。支持NSImage和UIImage,當(dāng)你寫到[UIImage imaged:的時(shí)候,插件會(huì)把項(xiàng)目中的圖片名稱提示出來,并且還有預(yù)覽功能,對(duì)經(jīng)常用代碼生成圖片視圖的童鞋十分方便。此控件使用很方便,只要打開所下載的工程然后編譯通過,再退出重新打開XCODE就可以了。下載地址:https://github.com/ksuther/KSImageNamed-Xcode

43、修改navigationBar背景色和title顏色

[userCenterNC.navigationBarsetBackgroundImage:[ToolimageWithColor:UIBUTTON_BGCORLOR]forBarMetrics:UIBarMetricsDefault];

userCenterNC.navigationBar.titleTextAttributes= [NSDictionarydictionaryWithObject:[UIColorwhiteColor]forKey:UITextAttributeTextColor];

//navigationBar返回顏色

userCenterNC.navigationBar.tintColor= [UIColorwhiteColor];

44、修改狀態(tài)欄為白色,在info.plist文件中添加兩個(gè)屬性

View controller-based status bar appearanceNO

[applicationsetStatusBarStyle:UIStatusBarStyleLightContent]; (此代碼加在AppDelegate中)

45、XCODE在Macbook Pro下觸摸板左右滑動(dòng)不能切換界面,這個(gè)問題搞了一個(gè)鐘頭,所以記錄一下:方法是在打開電腦的系統(tǒng)偏好設(shè)置——>觸控板——>更多手勢(shì),選中第一項(xiàng)“在頁面之間輕掃”并且給“兩個(gè)手指左右滾動(dòng)”打鉤。好了這樣就解決了,上圖會(huì)看的更清晰。

46、XCODE開發(fā)時(shí)有個(gè)插件可以自動(dòng)填充注釋VVDocumenter-Xcode,使用方法先去github下載工程,接著編譯成功后~/Library/Application Support/Developer/Shared/Xcode這個(gè)目錄中多了一個(gè)Contents文件,里面會(huì)有個(gè)Info.plist配置文件。這時(shí)重新啟動(dòng)XCODE就可以使用自動(dòng)注釋了,在方法前輸入///三個(gè)斜杠就可以了。

下載地址:https://github.com/onevcat/VVDocumenter-Xcode

47、iOS開發(fā)中有可能在程序打包前初始化很多數(shù)據(jù),比如題庫資料。上次同事給我整理了一份txt文檔,里面存儲(chǔ)的是大量的json數(shù)組,文件有3M左右,我剛開始用

[NSArray arrayWithContentsOfFile:path]讀取內(nèi)容,每次都返回nil,后來先給數(shù)組加了一個(gè)"key",先獲取data數(shù)據(jù),然后轉(zhuǎn)成字典。data已經(jīng)有數(shù)據(jù)了,但是字典還是nil。讓我很郁悶,后來我看到xcode中顯示的txt中文有亂碼,感覺跟編碼方式有關(guān)系,所以在MAC上先打開txt復(fù)制所有內(nèi)容,然后粘貼到xcode,這是xcode會(huì)提示你保存的utf-8格式,點(diǎn)擊確定,再次粘貼一下。發(fā)現(xiàn)xcode看到的txt都是中文。然后解析字典數(shù)據(jù)終于出來了,我內(nèi)個(gè)去啊。

48、關(guān)于autolayout在故事板的應(yīng)用

49、Schema->Run->Diagnostics 里面選中EnableAddressSanitizer這個(gè)選項(xiàng)打鉤太恐怖了。

今天使用MKMapView,一打開地圖內(nèi)存就持續(xù)暴漲,然后上到600M左右就閃退,浪費(fèi)一天時(shí)間沒找出問題,最后在XCODE中把上面的勾去掉,一切就好了。

[objc]view plaincopy

print?

50、storyboard故事板使用UIScroller注意事項(xiàng),在StoryBoard中使用UIScrollView一定要用下圖中的這種布局,如果剛開始沒想到用UIScrollView后來才想加,可以選中所有Subview然后選擇Editor?-?Embed?in?-?Scroll?View,ContentView忘加了也可以類似操作。

如果scrollerView的高度超過屏幕高度,還想要添加控件時(shí),設(shè)置Intrinsic Size 為 Placeholder,這樣storyboard會(huì)給你展示臨時(shí)的高度,運(yùn)行時(shí)不會(huì)以這個(gè)高度為準(zhǔn),或者設(shè)置viewcontroller的Simulated Size屬性為Freeform值,運(yùn)行時(shí)改回fixed就可以了。ScrollView上面的空間都要設(shè)置上下左右和寬高,除非是imageview設(shè)置了圖片會(huì)有默認(rèn)大小不需要約束寬高。布局時(shí)必須讓UIScrollView知道其contentSize大小,而不是一個(gè)不確定的值,這樣才算完成UIScrollView布局,不然會(huì)有類似這樣的警告:has ambiguous scrollable content height。

51、NSUserDefaults只能保存系統(tǒng)自帶對(duì)象,比如字典、字符串、數(shù)組等。并且不能有null值,否則會(huì)報(bào)錯(cuò)Attempt to set a non-property-list object。

52、蘋果推送證書跟bundle id是一一對(duì)應(yīng)的。

53、如果一個(gè)xib要裝載多個(gè)cell,記得在cell.h文件反過來再劃線到xib一次,不然經(jīng)常系統(tǒng)會(huì)錯(cuò)亂cell.h中的屬性是屬于xib中那個(gè)cell的。

54、想要headerView伴隨著cell一起向上滑動(dòng),也就是viewForHeaderInSection這個(gè)view。有兩種方式可以解決:

(1)在當(dāng)前控制器中重寫scrollViewDidScroll,這個(gè)方式在有下拉刷新和加載分頁時(shí)有些小問題。

[objc]view plaincopy

print?

-?(void)scrollViewDidScroll:(UIScrollView*)scrollView?{

if(scrollView?==self.tv)

{

CGFloat?sectionHeaderHeight?=?tvHeadViewHeight;

if(scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0)?{

scrollView.contentInset=?UIEdgeInsetsMake(-scrollView.contentOffset.y,0,0,0);

}elseif(scrollView.contentOffset.y>=sectionHeaderHeight)?{

scrollView.contentInset=?UIEdgeInsetsMake(-sectionHeaderHeight,0,0,0);

}

}

}

(2)設(shè)置tableView的style為UITableViewStyleGrouped,并且執(zhí)行代理方法heightForFooterInSection返回0.01,取消沒用的footer行。推薦第二種方法實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容