- autoLayout
Autolayout的作用非常明確:幫我們確定在不同設(shè)備永乌、不同(父view)環(huán)境下是趴,同一個(gè)可視單元所應(yīng)具有合適的位置和尺寸允跑,因此坛增,當(dāng)一個(gè)UIView上所施加的約束能夠唯一確定它的frame(x, y, width, height)的時(shí)候我們的自動(dòng)布局的使用才是正確的建椰。而新手通常犯的兩類錯(cuò)誤就是約束不足(約束太少)和約束沖突兩種(約束太多)雕欺。如果你給出的約束只能夠確定這個(gè)view的大小,或者位置或者位置中的某一個(gè)項(xiàng)(比如x)的時(shí)候棉姐,就會(huì)出現(xiàn)約束不足的情況屠列,在xib或者storyboard中,會(huì)以黃色的警告出現(xiàn)在左側(cè)提示框內(nèi)伞矩;如果你給出的約束推導(dǎo)出了兩個(gè)甚至多個(gè)互相矛盾的位置尺寸結(jié)果的時(shí)候笛洛,就產(chǎn)生了布局錯(cuò)誤,在編譯的時(shí)候直接就build不過乃坤。
-
在畫布中角度是順時(shí)針轉(zhuǎn)的
angle 引用
在繪制的方法中苛让,使用 UIGraphicsBeginImageContextWithOptions 來取代 UIGraphicsGetCurrentContext 出處
應(yīng)用間相互調(diào)用只要知道雙方設(shè)置好的URL就行了,打開另一個(gè)應(yīng)用時(shí)可以把當(dāng)前應(yīng)用的URL傳過去湿诊,要打開的應(yīng)用就可以根據(jù)響應(yīng)的代碼就可以讓用戶觸發(fā)返回原始應(yīng)用了
事件的響應(yīng)鏈?zhǔn)菑淖右晥D到父視圖層層傳遞的狱杰,模式是子視圖調(diào)用父視圖相同的方法([super XXX]),所以觸發(fā)該事件的先后順序應(yīng)該是從父視圖到子視圖厅须,當(dāng)然這是默認(rèn)情況仿畸,如果你重寫了事件方法,就可以控制是否把事件傳遞給父視圖朗和,或者哪個(gè)視圖先觸發(fā)事件
上面的理解貌似不夠準(zhǔn)確错沽,重新整理如下:
. 事件鏈的建立 簡(jiǎn)單講是發(fā)生在addSubView時(shí),被添加的視圖的nextResponder(下一個(gè)響應(yīng)者)就是它的父視圖例隆。如果一個(gè)veiw(下面簡(jiǎn)稱A)不是普通的view,它是某個(gè)viewcontroller的根veiw,那么A的nextResponder在A從初始化完后就賦值為viewController抢蚀。然后當(dāng)A被addsubview到rootview的時(shí)候(addChildViewController時(shí)會(huì)發(fā)生)镀层,Controller A的nextresponder被復(fù)制為rootview。
. 事件的傳遞 當(dāng)用戶觸摸時(shí),UIKit先創(chuàng)建一個(gè)事件對(duì)象唱逢,加到事件隊(duì)列中去吴侦,然后UIAPPlication從中取出來,從window開始查找坞古,發(fā)現(xiàn)點(diǎn)擊位置在window的范圍內(nèi)备韧,那就繼續(xù)查找window的subViews,直到找到視圖樹最頂部的葉子視圖,然后把事件交給這個(gè)頂部視圖痪枫,視圖處理事件织堂,如果不處理就交給它的nextResponser,層層往下,直到window再到UIApplacation奶陈。像素就是一個(gè)小點(diǎn)易阳,px就表示一個(gè)真正的點(diǎn),pt就是標(biāo)準(zhǔn)中定好的有大小的點(diǎn),1/72英寸,分辨率是指指每單位面積(平方英寸)像素的個(gè)個(gè)數(shù)吃粒,即dpi,之所以談到具體的設(shè)備時(shí)經(jīng)常用W*H表示分辨率潦俺,是用了當(dāng)前設(shè)備的長(zhǎng)寬方向上的像素除以當(dāng)前設(shè)備相應(yīng)的尺寸
devices只有選擇了universal(通用)才可以讓iPhone和iPad共用界面或者說不同尺寸的設(shè)備共用界面
IQKeyboardManager 必須是在push或者present的VC的視圖上才可以自動(dòng)調(diào)整位置 事后問過作者,說怎么都可以徐勃,但是我用的版本卻實(shí)不行事示,作者給意見,可以考慮addChildViewCOntroller
從UINavigationController里出來的UIViewController無法不會(huì)執(zhí)行shouldAutorotate,這種情況必須自定義一個(gè)繼承UINavigationController的類
要實(shí)現(xiàn)UITableViewCell的編輯必須實(shí)現(xiàn)下面兩個(gè)方法
(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath;關(guān)于堆棧的理解 :棧 — 戰(zhàn)死 棧是死的僻肖,一般是提前分配好的肖爵,除非你malloc出來,堆的可控性就比較強(qiáng)檐涝,也就是自己控制它的創(chuàng)建遏匆,當(dāng)然它的消亡也應(yīng)該你來控制
舉個(gè)小栗:在一個(gè)函數(shù)中定義了 NSArray *a = [[NSArray alloc] init] a是個(gè)指針,他就是放在棧中的谁榜,但是它指向的那個(gè)數(shù)組就是存在堆中的幅聘。objective-c因?yàn)樽址容^特殊,所以在寫正則的時(shí)候窃植,碰到轉(zhuǎn)義字符必須多加一個(gè)”\\”帝蒿,比如:全數(shù)字字符:@"^\\\\d\\+$"
UITableView竟然被我發(fā)現(xiàn)了一個(gè)新用法(當(dāng)然這個(gè)用法是舊的),它在編輯狀態(tài)下可以左邊顯示圓圈巷怜,didSelected會(huì)自動(dòng)選中葛超,再按一次didDeselect會(huì)自動(dòng)消失
下面這句話的意思是獲取aView在window中的位置,注意最前邊是aView的父視圖
[aView.superview convertPoint:aView.frame.origin toView:nil];UIView不能同事加多個(gè)由make生成的transform,如果加多個(gè)延塑,第二個(gè)應(yīng)該用原始方法绣张,如下
self.contentViewContainer.transform = CGAffineTransformMakeTranslation(point.x, 0);
self.contentViewContainer.transform = CGAffineTransformScale(self.contentViewContainer.transform,scale, scale);extern 是表明這個(gè)這個(gè)變量是全局的,在其他類里也可以使用這個(gè)變量不必把首次聲明這個(gè)變量的類引入就行关带,但是必須得再次聲明侥涵,static是僅限于此類里使用,其他類要想使用必須引入該類
圖片的坐標(biāo)原點(diǎn)在左下角
關(guān)于刷新子視圖
-layoutSubviews方法:這個(gè)方法,默認(rèn)沒有做任何事情芜飘,需要子類進(jìn)行重寫
-setNeedsLayout方法: 標(biāo)記為需要重新布局务豺,異步調(diào)用layoutIfNeeded刷新布局,不立即刷新嗦明,但layoutSubviews一定會(huì)被調(diào)用
-layoutIfNeeded方法:如果笼沥,有需要刷新的標(biāo)記,立即調(diào)用layoutSubviews進(jìn)行布局(如果沒有標(biāo)記娶牌,不會(huì)調(diào)用layoutSubviews)
如果要立即刷新奔浅,要先調(diào)用[view setNeedsLayout],把標(biāo)記設(shè)為需要布局裙戏,然后馬上調(diào)用[view layoutIfNeeded]乘凸,實(shí)現(xiàn)布局
我勒個(gè)去哎,self.navigationController.toolbarHidden = NO 這樣可以在View下邊有顯示一個(gè)toolbar哎累榜,這個(gè)是可以利用的喲营勤,完成任務(wù)必須抽時(shí)間好好研究一番,新發(fā)現(xiàn)啊
下面的代碼輸出什么
@implementation Son : Father
- (id)init{
self = [super init]; if (self) {
NSLog(@"%@", NSStringFromClass([self class]));
NSLog(@"%@", NSStringFromClass([super class]));
}
return self;
}
@end
答案:都輸出”Son”解釋:objc中super是編譯器標(biāo)示符壹罚,并不像self一樣是一個(gè)對(duì)象葛作,遇到向super發(fā)的方法時(shí)會(huì)轉(zhuǎn)譯成objc_msgSendSuper(...),而參數(shù)中的對(duì)象還是self猖凛,于是從父類開始沿繼承鏈尋找- class這個(gè)方法赂蠢,最后在NSObject中找到(若override)此時(shí),[self class]和[super class]已經(jīng)等價(jià)了辨泳。
所以虱岂,子類調(diào)用父類的某個(gè)方法,父類的這個(gè)方法又調(diào)用了一個(gè)跟子類有相同名字的某個(gè)方法菠红,相當(dāng)于子類直接調(diào)用了這個(gè)方法
UITextField是有l(wèi)eftView和rightView的第岖,可以利用leftView在添加了背景圖片后添加左邊留白,但是得注意要設(shè)置屬性
leftViewMode = UITextFieldViewModeAlwaysload方法會(huì)在類實(shí)例話的時(shí)候調(diào)用试溯,如果要用runtime黑魔法的話就可以在這里用蔑滓。initializer方法會(huì)在第一次調(diào)用該類的方法時(shí)調(diào)用這個(gè)方法,屬于懶加載
UITableView的header是searchBar的時(shí)候拖拽時(shí)searchBar背景會(huì)被拉伸
視圖控制器切換方法
- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(5_0);
不用你再去給容器視圖添加(addSubView)和刪除(removeFromSuperView)子視圖遇绞,它會(huì)幫你處理好哈哈哈键袱,XCode好傻喲,如果你在.m文件里提前有了 setX和x方法摹闽,然后才在.h文件里用
@property
聲明x屬性蹄咖,.m里就不允許你使用_x這個(gè)變量。此時(shí)付鹿,@synthesize
就派上了用場(chǎng)澜汤。@dynamic
與@synthesize
的區(qū)別在于:使用@synthesize
編譯器會(huì)確實(shí)的產(chǎn)生getter和setter方法铝量,而@dynami
c僅僅是告訴編譯器這兩個(gè)方法在運(yùn)行期會(huì)有的,無需產(chǎn)生警告银亲。
假設(shè)有這么個(gè)場(chǎng)景,B類纽匙,C類分別繼承A類务蝠,A類實(shí)現(xiàn)某個(gè)協(xié)議(@protocol),協(xié)議中某個(gè)屬性( somePropety )我不想在A中實(shí)現(xiàn)烛缔,而在B類馏段,C類中分別實(shí)現(xiàn)。如果A中不寫任何代碼践瓷,編譯器就會(huì)給出警告:
“use @synthesize, @dynamic or provide a method implementation"
這時(shí)你給用@dynamic somePropety; 編譯器就不會(huì)警告院喜,同時(shí)也不會(huì)產(chǎn)生任何默認(rèn)代碼。
UITableView在編輯狀態(tài)下如果指定編輯樣式是添加和刪除晕翠,可以在視圖上顯示復(fù)選框喷舀,利用這個(gè)特性可以方便實(shí)現(xiàn)多選。
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
}
注意:以上是在UITableView單選的情況下淋肾,如果是多選就會(huì)自動(dòng)出現(xiàn)復(fù)選框硫麻,不會(huì)執(zhí)行上段代碼。??說了好多廢話喲UITableView在調(diào)用了reloadData之后樊卓,tableView會(huì)在調(diào)用完cell的高度獲知contentSize之后就調(diào)用reloadData之后的語(yǔ)句了拿愧,完了之后才去加載cell
在 MRC 下,使用 __block 說明符也可以避免循環(huán)引用碌尔。因?yàn)楫?dāng) block 從椊焦迹拷貝到堆時(shí),__block 對(duì)象類型的變量不會(huì)被 retain唾戚,沒有 __block 說明符的對(duì)象類型的變量則會(huì)被 retian柳洋。正是由于 __block 在 ARC 和 MRC 下的巨大差異,我們?cè)趯懘a時(shí)一定要區(qū)分清楚到底是 ARC 還是 MRC颈走。
-
實(shí)現(xiàn)下面的方法膳灶,我們就可以對(duì)一個(gè)類進(jìn)行使用想NSArray和NSDictionary那樣的語(yǔ)法糖用下標(biāo)或者key來存取數(shù)據(jù)了, so cool
- (id)objectAtIndexedSubscript:(NSUInteger)idx; - (void)setObject:(id)objatIndexedSubscript:(NSUInteger)idx; - (void)setObject:(id)objforKeyedSubscript:(id <NSCopying>)key; - (id)objectForKeyedSubscript:(id)key;
CALayer的border是出現(xiàn)在layer內(nèi)部的,比如說layerWidth為10,那么border就會(huì)占據(jù)layer的content的四周寬度為10的空間立由。
系統(tǒng)視頻的上傳必須拷貝到沙盒目錄中才能上傳轧钓。??
手?jǐn)]NSLayoutConstraint需要注意firstItem和secondItem的順序
注意了,注意了锐膜,keyWindow不知道什么時(shí)候會(huì)被系統(tǒng)干掉毕箍,所以把hud加在keyWindow上的時(shí)候一定要注意哦。最近遇到的在把mov轉(zhuǎn)換成mp4的時(shí)候系統(tǒng)起了個(gè)異步線程道盏,然后kenWindow就被干掉了而柑。
用CGContextClearRect就可以實(shí)現(xiàn)畫一張中間透明的圖片了文捶。
-
想知道某個(gè)變量在程序調(diào)試時(shí)的狀態(tài),可以用借助dispatch_source_t 監(jiān)控調(diào)試開始媒咳,打印變量 from
dispatch_queue_t queue = dispatch_get_main_queue(); static dispatch_source_t source = nil; __typeof(self) __weak weakSelf = self; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ source = dispatch_source_create(DISPATCH_SOURCE_TYPE_SIGNAL, SIGSTOP, 0, queue); if (source) { dispatch_source_set_event_handler(source, ^{ NSLog(@"Hi, I am: %@", weakSelf); }); dispatch_resume(source); // 10 } });
當(dāng)UINavigationController push或者pop操作時(shí)NavigationBar右側(cè)底部會(huì)變灰粹排,解決這種問題需要把最接近當(dāng)前vc的view的view的背景色修改一下就可以了。
- 企業(yè)賬戶 往App Store上發(fā)布應(yīng)用必須是Agent賬戶
- 用Xcode寫C涩澡,即使僅僅有C也要把Compile Sources As改為Objective C++
- 我一直以為下邊的代碼是默認(rèn)的顽耳,然而并不是,需要明確寫出來妙同。??
self.tableView.rowHeight = UITableViewAutomaticDimension; - CALayer對(duì)path的動(dòng)畫執(zhí)行完后path為初始值,如果想要最后停留住狀態(tài)就可以把初始值設(shè)為toValue的值
- iOS11的本地通知要想在前臺(tái)顯示必須實(shí)現(xiàn)代理willPresent的方法,文檔有說明的,記住