前言:
最近把 iOS 面試中可能會遇到的問題整理了一番, 題目大部分是網上收錄的, 方便自己鞏固復習, 也分享給大家搂誉; 希望對大家有所幫助芦拿!
- 對于答案支示,不一定都合適广辰,歡迎大家積極討論暇矫;整理不易,如果您覺得還不錯轨域,麻煩在文末 “點個贊” 袱耽,或者留下您的評論“Mark” 一下杀餐,謝謝您的支持
目錄合集
- iOS面試題--面試常問問題(一)
- iOS面試題--面試常問問題(二)
- iOS面試題--面試常問問題(三)
- iOS面試題--常問UI問題(四)
- iOS面試題--常問內存管理問題(五)
- iOS面試題--常問多線程問題(六)
- iOS面試題--網絡相關問題(七)
- iOS面試題--常問Swift問題(八)
iOS面試題-常問UI問題(四)
1.ViewController 生命周期
單個viewController的生命周期
- initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)
- loadView:加載view
- viewDidLoad:view加載完畢
- viewWillAppear:控制器的view將要顯示
- viewWillLayoutSubviews:控制器的view將要布局子控件
- viewDidLayoutSubviews:控制器的view布局子控件完成
- viewDidAppear:控制器的view完全顯示
- viewWillDisappear:控制器的view即將消失的時候
- viewDidDisappear:控制器的view完全消失的時候
- dealloc 控制器銷毀
兩個控制器AB進行跳轉調用順序:
A控制器先展示調用
- [ViewControllerA loadView]
- [ViewControllerA viewWillAppear:]
- [ViewControllerA viewWillLayoutSubviews]
- [ViewControllerA viewDidLayoutSubviews]
- [ViewControllerA viewDidAppear:]
B控制器跳轉調用順序
- [ViewControllerB loadView]
- [ViewControllerB viewDidLoad]
- [ViewControllerA viewWillDisappear:]
- [ViewControllerB viewWillAppear:]
- [ViewControllerB viewWillLayoutSubviews]
- [ViewControllerB viewDidLayoutSubviews]
- [ViewControllerA viewDidDisappear:]
- [ViewControllerB viewDidAppear:]
B控制器返回A順序
- [ViewControllerB viewWillDisappear:]
- [ViewControllerA viewWillAppear:]
- [ViewControllerB viewDidDisappear:]
- [ViewControllerA viewDidAppear:]
2. CALayer 和 UIView
UIView 和 CALayer都是 UI 操作的對象
UIView是 CALayer用于交互的對象,UIView是CALayer的delegate ,UIView是UIResponder的子類,其中提供了很多CALayer所沒有的交互接口,主要負責處理用戶觸發(fā)的各種操作;
CALayer主要負責繪制,在圖像和動畫上渲染性能更好;
3.UIView 的frame干发,bounds,center
- frame: 描述當前界面元素在其父界面元素中的位置和大小史翘。
- bounds: 描述當前界面元素在其自身坐標系統(tǒng)中的位置和大小枉长。
- center: 描述當前界面元素的中心點在其父界面元素中的位置.
4.CALayer的frame,bounds琼讽,anchorPoint,position
- frame:與view中的frame概念相同必峰,(x,y)subLayer左上角相對于supLayer坐標系的位置關系;width, height表示subLayer的寬度和高度钻蹬。
- bounds:與view中的bounds概念相同吼蚁,(x,y)subLayer左上角相對于自身坐標系的關系;width, height表示subLayer的寬度和高度。
- anchorPoint(錨點):錨點在自身坐標系中的相對位置肝匆,默認值為(0.5粒蜈,0.5),左上角為(0旗国,0)枯怖,右下角為(1,1)能曾,其他位置以此類推度硝;錨點都是對于自身來講的. 確定自身的錨點,通常用于做相對的tranform變換.當然也可以用來確定位置;
- position:錨點在supLayer坐標系中的位置寿冕;
5.iOS 為什么必須在主線程中操作UI
- UIKit不是線程安全的(多個線程訪問修改,可能一個線程已經釋放了,另一個線程會訪問,以及資源搶奪問題等)
- 主線程上默認是開始 runloop 的,子線程沒有 runloop 也無法監(jiān)聽一些事件,手勢刷新UI等操作
- 在子線程更新UI可能會無效,也可能會崩潰
精選全網 · iOS面試題答案PDF文集
- 獲取加小編的iOS技術交流圈:937 194 184蕊程,直接獲取
6. 如何處理UITableVier 中Cell 動態(tài)計算高度的問題,都有哪些方案
- 你的Cell要使用AutoLayout來布局約束這是必須的驼唱;設置tableview的estimatedRowHeight為一個非零值存捺,這個屬性是設置一個預估的高度值,不用太精確曙蒸。 設置tableview的rowHeight屬性為UITableViewAutomaticDimension
- 第三方 UITableView+FDTemplateLayoutCell(計算布局高度緩存的)
- 手動計算每個控件的 高度并相加,最后緩存高度
7. AutoLayout 中的優(yōu)先級是什么?
AutoLayout中添加的約束也有優(yōu)先級,優(yōu)先級的數值是1~1000
- 一種情況是我們經常添加的各種約束,默認的優(yōu)先級是1000捌治,也就是最高級別,條件允許的話系統(tǒng)會滿足我們所有的約束需求纽窟。
- 另外一種情況就是固有約束(intinsic content size)
- Content Hugging Priority 抗拉伸優(yōu)先級值越小肖油,越容易被拉伸
- Content Compression Resistance 抗壓縮優(yōu)先級 優(yōu)先級越小,越先被壓縮
8. 怎么高效的實現控件的圓角效果?
//直接對圖片進行重繪 (使用Core Graphics),實際開發(fā)加異步處理,也可以給 SDWebImage 也做擴展;
- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
CGRect rect = (CGRect){0.f, 0.f, self.size};
UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
CGContextAddPath(UIGraphicsGetCurrentContext(), [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
CGContextClip(UIGraphicsGetCurrentContext());
[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
// 利用CAShapeLayer圓角,替換原本的layer,達到圓角效果
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:self.bounds.size];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc]init];
maskLayer.frame = self.bounds;
maskLayer.path = maskPath.CGPath;
self.layer.mask = maskLayer;
9.CALayer如何添加點擊事件
- 通過 touchesBegan: withEvent 方法,監(jiān)聽屏幕點擊事件,在這個方法中通過 convertPoint 找到點擊位置,進行判斷,如果點擊了 layer 視圖內坐標,就觸發(fā)點擊事件
- 通過 hitTest方法找到包含坐標系的 layer 視圖
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 方法一,通過 convertPoint 轉為為 layer 坐標系進行判斷
CGPoint point = [[touches anyObject] locationInView:self.view];
CGPoint redPoint = [self.redLayer convertPoint:point fromLayer:self.view.layer];
if ([self.redLayer containsPoint:redPoint]) {
NSLog(@"點擊了calayer");
}
// 方法二 通過 hitTest 返回包含坐標系的 layer 視圖
CGPoint point1 = [[touches anyObject] locationInView:self.view];
CALayer *layer = [self.view.layer hitTest:point1];
if (layer == self.redLayer) {
NSLog(@"點擊了calayer");
}
}
10.介紹下layoutSubview和drawRect
-
layoutSubviews調用情況:
- init初始化UIView不會觸發(fā)調用
- addSubview會觸發(fā)調用
- 改變view的width和height的時候回觸發(fā)調用
- 一個UIScrollView滾動會觸發(fā)調用
- 旋轉screen會觸發(fā)調用
- 改變一個UIView大小的時候會觸發(fā)superView的layoutSubviews事件
- 直接調用setLayoutSubviews會觸發(fā)調用
- -(void)viewWillAppear:(BOOL)animated會觸發(fā)一次調用
- -(void)viewDidAppear:(BOOL)animated 看情況臂港,可能有調用
-
drawRect調用情況
- 如果UIView沒有設置frame大小森枪,直接導致drawRect不能被自動調用。
- drawRect在loadView和viewDidLoad這兩個方法之后調用
- 調用sizeToFit后自動調用drawRect
- 通過設置contentMode值為UIViewContentModeRedraw审孽。那么每次設置或者更改frame自動調用drawRect县袱。
- 直接調用setNeedsDisplay或者setNeedsDisplayInRect會觸發(fā)調用
11. layoutIfNeeded , layoutSubViews和 setNeedsLayout區(qū)別?
- layoutIfNeeded 方法一點被調用,主線程會立即強制重新布局,它會從當前視圖開始,一直到完成所有子視圖的布局
- layoutSubViews 用來自定義視圖尺寸,他是系統(tǒng)自動調用的,開發(fā)者不能手動調用,可以重寫改方法,讓系統(tǒng)在調整布局時候按照我們希望的方式進行布局.這個方法在旋轉屏幕,滑動或者觸摸屏幕,修改子視圖時候被觸發(fā).
- setNeedsLayout 和 layoutIfNeeded相似,唯一不同的是他不會立即強制視圖重新布局,而是在下一個布局周期才會觸發(fā)更新.他主要用于多個視圖布局先后更新的場景;
12.假如Controller太臃腫快毛,如何優(yōu)化?
- 將網絡請求抽象到單獨的類中,方便在基類中處理公共邏輯烘苹;方便在基類中處理緩存邏輯,以及其它一些公共邏輯惧眠;方便做對象的持久化打颤。
- 將界面的封裝抽象到專門的類中, 構造專門的 UIView 的子類暴拄,來負責這些控件的拼裝。這是最徹底和優(yōu)雅的方式编饺,不過稍微麻煩一些的是乖篷,你需要把這些控件的事件回調先接管,再都一一暴露回 Controller透且。
- 構造 ViewModel, 借鑒MVVM撕蔼。具體做法就是將 ViewController 給 View 傳遞數據這個過程,抽象成構造 ViewModel 的過程。
- 專門構造存儲類,專門來處理本地數據的存取鲸沮。
- 整合常量
13.程序啟動過程
main 函數執(zhí)行前:
- 首先當程序啟動時畅形,系統(tǒng)會讀取程序的可執(zhí)行文件(mach-o), 從里面獲取動態(tài)加載器(dylb)的路徑;
- 加載dylb, dylb會初始化運行環(huán)境,配合ImageLoader將二進制文件加載到內存中去;
- 動態(tài)鏈接依賴庫, 初始化依賴庫诉探,初始化 runtime;
- runtime 會對項目中的所有類進行類結構初始化日熬,調用所有的 load 方法;
- 最后 dylb 會返回 main 函數地址,main 函數被調用肾胯,進入程序入口
main 函數執(zhí)行后:
- 內部會調用 UIApplicationMain 函數竖席,創(chuàng)建一個UIApplication對象和它的代理,就是我們項目中的 Appdelegate 類
- 開啟一個事件循環(huán)(main runloop), 監(jiān)聽系統(tǒng)事件
- 程序啟動完畢時敬肚,通知代理Appdelegate, 調用 didFinishLaunching 代理方法毕荐,在這里會創(chuàng)建 UIWindow,設置它的rootViewController,
- 最后調用 self.window makeKeyAndVisable顯示窗口
14.渲染以及圖像顯示原理過程?
- 每一個UIView都有一個layer,每一個layer都有個content艳馒,這個content指向的是一塊緩存憎亚,叫做backing store。
- UIView的繪制和渲染是兩個過程弄慰,當UIView被繪制時第美,CPU執(zhí)行drawRect,通過context將數據寫入backing store陆爽。
- 當backing store寫完后什往,通過render server交給GPU去渲染,將backing store中的bitmap數據顯示在屏幕上慌闭。
- 說到底CPU就是做繪制的操作把內容放到緩存里别威,GPU負責從緩存里讀取數據然后渲染到屏幕上。
15.離屏渲染是什么
- 離屏渲染驴剔,指的是 GPU (圖形處理器)在當前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染操作省古。為什么離屏這么耗時?原因主要有創(chuàng)建緩沖區(qū)和上下文切換丧失。創(chuàng)建新的緩沖區(qū)代價都不算大豺妓,付出最大代價的是上下文切換。
- GPU屏幕渲染有兩種方式:
- On-Screen Rendering (當前屏幕渲染) 指的是GPU的渲染操作是在當前用于顯示的屏幕緩沖區(qū)進行利花。
- Off-Screen Rendering (離屏渲染) 指的是在GPU在當前屏幕緩沖區(qū)以外開辟一個緩沖區(qū)進行渲染操作科侈。
16. 那些情況會造成離屏渲染?
- 為圖層設置遮罩(layer.mask)
- 將圖層的layer.masksToBounds / view.clipsToBounds屬性設置為true
- 將圖層layer.allowsGroupOpacity屬性設置為YES和layer.opacity小于1.0
- 為圖層設置陰影(layer.shadow *)。
- 為圖層設置layer.shouldRasterize=true
- 具有l(wèi)ayer.cornerRadius炒事,layer.edgeAntialiasingMask,layer.allowsEdgeAntialiasing的圖層
- 文本(任何種類蔫慧,包括UILabel挠乳,CATextLayer,Core Text等)。
17.手機適配方案
- 使用宏,針對不同的設備抽取導航,狀態(tài)欄,以及 tabbar 高度信息
- 寬高等比適配(X 的特殊處理)
- 圖片美工需要提供@2x,@3x進行適配
- 字體根據屏幕大小適配
- 權限針對不同系統(tǒng)進行適配
- api 適配
18. 什么是懶加載?
懶加載 也叫做 延遲加載
,他的核心思想就是把對象的實例化盡量延遲,在需要使用的時候才會初始化,這樣做的好處可以減輕大量對象實例化對資源的消耗.
另外懶加載把對象的實例化代碼抽取出來獨立出來,提高代碼的可讀性,以便代碼更好的被組織
19.什么是響應者鏈?
響應者鏈是用于確定事件響應
的一種機制, 事件主要是指觸摸事件(touch Event),該機制與UIKIT中的UIResponder類密切相關,響應觸摸事件的必須是繼承自UIResponder的類,比如UIView 和UIViewController
一個事件響應者的完成主要分為2個過程: hitTest方法命中視圖和響應者鏈確定響應者; hitTest的調用順序是從UIWindow開始睡扬,對視圖的每個子視圖依次調用盟蚣,也可以說是從顯示最上面到最下面,直到找命中者; 然后命中者視圖沿著響應者鏈往上傳遞尋找真正的響應者.
事件傳遞過程
- 當我們觸控手機屏幕時系統(tǒng)便會將這一操作封裝成一個UIEvent放到事件隊列里面,然后Application從事件隊列取出這個事件卖怜,接著需要找到命中者, 所以開始的第一步應該是找到命中者, 那么又是如何找到的呢屎开?那就不得不引出UIView的2個方法:
// 返回能夠相應該事件的視圖
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
// 查看點擊的位置是否在這個視圖上
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
- 尋找事件的命中視圖是通過對視圖調用hitTest和pointInside完成的 hitTest的調用順序是從UIWindow開始,對視圖的每個子視圖依次調用马靠,也可以說是從顯示最上面到最下面 遍歷直到找到命中視圖;
響應鏈傳遞
- 找到命中者,任務并未完成,因為命中者不一定是事件的響應者,所謂響應就是開發(fā)中為事件綁定一個觸發(fā)函數,事件發(fā)生后,執(zhí)行響應函數里的代碼
- 找到命中視圖后事件會從此視圖開始沿著響應鏈nextResponder傳遞奄抽,直到找到處理事件的響應視圖,如果沒有處理的事件會被丟棄。
- 如果視圖有父視圖則nextResponder指向父視圖甩鳄,如果是根視圖則指向控制器逞度,最終指向AppDelegate, 他們都是通過重寫nextResponder來實現。
- 自下往上查找
無法響應的事件情況
- Alpha=0妙啃、
- 子視圖超出父視圖的情況档泽、
- userInteractionEnabled=NO、
- hidden=YES
精選全網 · iOS面試題答案PDF文集
- 獲取加小編的iOS技術交流圈:937 194 184揖赴,直接獲取
20.動畫相關有哪幾種方式?
- UIView animation --- 可以實現基于 UIView 的簡單動畫,他是CALayer Animation封裝,可以實現移動,旋轉,變色,縮放等基本操作,他實現的動畫無法回撤,暫停,與手勢交互,常用方法如下
[UIView animateWithDuration: 10 animations:^{
// 動畫操作
}];
UIViewPropertyAnimator --- 是 iOS10 中引入的處理交互式動畫接口,他是基于 UIView 實現的, 用法同 UIView animation比較類似,增加了一些新的屬性以及方法;
CALayer Animation --- 是在更底層CALayer 上的動畫接口, 他可以實現各種復雜的動畫效果, 實現的動畫可以回撤,暫停與手勢交互等,常用的類有以下幾個:
1. CABasicAnimation——基本動畫
2. CAKeyframeAnimation——關鍵幀動畫
與CABasicAnimation的區(qū)別是:CABasicAnimation:只能從一個數值(fromValue)變到另一個數值(toValue)CAKeyframeAnimation:會使用一個NSArray保存這些數值
3. CAAnimationGroup——動畫組
動畫組馆匿,是CAAnimation的子類,可以保存一組動畫對象燥滑,將CAAnimationGroup對象加入層后甜熔,組中所有動畫對象可以同時并發(fā)運行
4. 轉場動畫——CATransition
CATransition是CAAnimation的子類,用于做轉場動畫突倍,能夠為層提供移出屏幕和移入屏幕的動畫效果腔稀。iOS比Mac OS X的轉場動畫效果少一點。
21. UIScrollView 原理
- UIScrollView繼承自UIView羽历,內部有一個 UIPanGestureRecongnizer手勢焊虏。 frame 是相對父視圖坐標系來決定自己的位置和大小,而bounds是相對于自身坐標系的位置和尺寸的秕磷。改視圖 bounds 的 origin 視圖本身沒有發(fā)生變化诵闭,但是它的子視圖的位置卻發(fā)生了變化,因為 bounds 的 origin 值是基于自身的坐標系澎嚣,當自身坐標系的位置被改變了疏尿,里面的子視圖肯定得變化, bounds 和 panGestureRecognize 是實現 UIScrollView 滑動效果的關鍵技術點易桃。
22. loadView 的作用?
- loadView 用來自定義 view褥琐,只要實現了這個方法,其他通過 xib 或 storyboard 創(chuàng) 建的 view 都不會被加載
23. IBOutlet 連出來的視圖屬性為什么可以被設 置成 weak?
- 因為父控件的 subViews 數組已經對它有一個強引用
24. 請簡述 UITableViewCell的復用機制
- 每次創(chuàng)建 cell 的時候通過 dequeueReusableCellWithIdentifier:方法創(chuàng)建 cell晤郑,它先到 緩存池中找指定標識的 cell敌呈,如果沒有就直接返回 nil
- 如果沒有找到指定標識的 cell贸宏,那么會通過 initWithStyle:reuseIdentifier:創(chuàng)建一個 cell
- 當 cell 離開界面就會被放到緩存池中,以供下次復用
25. 使用 drawRect 有什么影響?
- drawRect 方法依賴 Core Graphics 框架來進行自定義的繪制
- 缺點:它處理 touch 事件時每次按鈕被點擊后磕洪,都會用 setNeddsDisplay 進行強制
- 重繪;而且不止一次吭练,每次單點事件觸發(fā)兩次執(zhí)行。這樣的話從性能的角度來 說析显,對 CPU 和內存來說都是欠佳的鲫咽。特別是如果在我們的界面上有多個這樣的 UIButton 實例,那就會很糟糕了
- 這個方法的調用機制也是非常特別. 當你調用 setNeedsDisplay 方法時, UIKit 將會 把當前圖層標記為 dirty,但還是會顯示原來的內容,直到下一次的視圖渲染周期,才會 將標記為 dirty 的圖層重新建立 Core Graphics 上下文,然后將內存中的數據恢復出 來, 再使用 CGContextRef 進行繪制
26. 能否在一個控制器 嵌入2個 TableViewController 控制器
- 可以, 控制器可以添加子控制器
27. 一個 TableView 是否可以關聯2個不同的dataSource?
- 可以關聯多個數據源,重點只要處理好數據源和 tableView 的對接工作即可
28. masksToBounds 和clipsToBounds
- masksToBounds 是指子 layer 在超出父 layer時是否被裁剪,YES表示參見,NO 表示不裁剪, 默認是NO
clipsToBounds 是指子 View 在超出父 View時是否被裁剪
29. tintColor 是什么?
- tintColor 是 ios7以后 UIView類添加的一個新屬性,用于改變應用的主色調,默認是 nil
30. imageNamed 和 imageWithContentsOfFile區(qū)別
- imageNamed 會自動緩存新加載的圖片,并切重復利用緩存圖片,一般用于App 內經常使用的尺寸不大的圖片
- imageWithContentsOfFile 根據路徑加載沒有 取緩存和緩存的過程,用于一些大圖,使用完畢會釋放內存
31. View 和 View 傳值方式有哪些
- 通過視圖類對外提供的屬性直接傳值
- 通過代理傳值
- 通過通知傳值
- 通過 Block 傳值
- 通過NSUserDefault, 不建議
32. 為什么iOS提供 UIView 和CAlayer 兩個個平行的層級結構
- UIView 和CAlayer2個平行的層級結構主要是用于職責分離,實現視圖的繪制,顯示,布局解耦,避免重復代碼
- 在iOS 和 Mac OS兩個平臺上,事件和用戶交互有很多不同的地方,創(chuàng)建2個層級結構,可以在2個平臺上共享代碼,從而使得開發(fā)快捷.
33. UIWindow是什么,有什么特點?
- UIWindow 繼承自 UIView, 作為根視圖來裝置 View元素, UIWindow提供一個區(qū)域用于顯示UIView,并且將事件分發(fā)給 UIView,一般一個應用只有一個 UIWindow;
精選全網 · iOS面試題答案PDF文集
- 獲取加小編的iOS技術交流圈:937 194 184谷异,直接獲取
34. 什么是隱式動畫和顯示動畫
- 隱式動畫是系統(tǒng)框架自動完成的分尸。Core Animation在每個runloop周期中自動開始一次新的事務,即使你不顯式的用[CATransaction begin]開始一次事務晰绎,任何在一次runloop循環(huán)中屬性的改變都會被集中起來寓落,然后做一次0.25秒的動畫。在iOS4中荞下,蘋果對UIView添加了一種基于block的動畫方法:+animateWithDuration:animations:伶选。這樣寫對做一堆的屬性動畫在語法上會更加簡單,但實質上它們都是在做同樣的事情尖昏。CATransaction的+begin和+commit方法在+animateWithDuration:animations:內部自動調用仰税,這樣block中所有屬性的改變都會被事務所包含,多用于簡單動畫效果
[UIView animateWithDuration:1 animations:^{
view.center = self.view.center;
}];
- 顯式動畫,Core Animation提供的顯式動畫類型抽诉,既可以直接對layer層屬性做動畫陨簇,也可以覆蓋默認的圖層行為。我們經常使用的CABasicAnimation迹淌,CAKeyframeAnimation河绽,CATransitionAnimation,CAAnimationGroup等都是顯式動畫類型唉窃,這些CAAnimation類型可以直接提交到CALayer上耙饰。顯式動畫可用于實現更為復雜的動畫效果.
CABasicAnimation *positionAnima = [CABasicAnimation animationWithKeyPath:@"position.y"];
positionAnima.duration = 0.8;
positionAnima.fromValue = @(self.imageView.center.y);
positionAnima.toValue = @(self.imageView.center.y-30);
positionAnima.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
positionAnima.repeatCount = HUGE_VALF;
positionAnima.repeatDuration = 2;
positionAnima.removedOnCompletion = NO;
positionAnima.fillMode = kCAFillModeForwards;
[self.imageView.layer addAnimation:positionAnima forKey:@"AnimationMoveY"];
35. UIButton 和UITableView的層級結構
-
繼承結構
- UIButton -> UIControl -> UIView -> UIResponder -> NSObject
- UITableView -> UIScrollView -> UIView -> UIResponder -> NSObject
-
內部子控件結構
- UIButton內部子控件結構: 默認有兩個, 一個UIImageView, 一個UILable, 分別可以設置圖片和文字, button設置屬性基本都是set方法
- UITableView內部子控件結構: UITableView中每一行數據都是UITableViewCell, UITableViewCell內部有一個UIView控件 (contentView, 作為其它元素的父控件) , 兩個UILable 控件 (textLable, detailTextLable) , 一個UIImageView控件 (imageView) , 分別用于容器, 顯示內容, 詳情和圖片
36. Storyboard/xib 和 純代碼UI相比,有哪些優(yōu)缺點
優(yōu)點:
- 簡單直接快速, 通過拖拽和點選即可配置UI,界面所見即所得
- 在 Storybord可以清楚的區(qū)分ViewController 界面之間的跳轉關系
缺點:
- 協作沖突,多人編輯時,容易發(fā)生沖突,很難解決沖突
- 很難做到界面繼承和重用
- 不便于進行模塊化管理
- 影響性能
37. AutoLayout 和 Frame在UI布局和渲染上有什么區(qū)別?
- AutoLayout是針對多尺寸屏幕的設計,其本質是通過線性不等式設置UI控件的相對位置,從而適配多種屏幕設備
- Frame 是基于XY坐標軸系統(tǒng)布局機制,它從數學上限定了UI 控件的具體位置,是 iOS'開發(fā)中最低層,最基本的界面布局方式
- AutoLayout性能比 Frame 差很多,AutoLayout布局過程是首先求解線性不等式,然后在轉化為Frame進行布局,其中求解計算量非常大,很損耗性能;
38. SafeArea, SafeAreaLayoutGuide, SafeAreaInsets 關鍵詞的比較說明?
由于 iphoneX 采用了劉海
設計,iOS11引入了安全區(qū)域(SafeArea)
概念
- SafeArea是指App 顯示內容的區(qū)域,不包括StatusBar,Navigationbar,tabbar,和 toolbar, 在 iPhoneX 中一般是指扣除了statusBar(44像素),和底部home indicator(高度為34像素)的區(qū)域.這樣操作不會被劉海或者底部手勢影響了.
- SafeAreaLayoutGuide 是指 Safe Area 的區(qū)域范圍和限制, 在布局設置中,可以取得他的上下左右4個邊界位置進行相應的布局
- SafeAreaInsets限定了Safe Area區(qū)域與整個屏幕之間的布局關系,一般用上下左右4個值來獲取 SafeArea 與屏幕邊緣之間的距離;
39. UIScrollView 的 contentView, contentInset, contentSize, contentOffset 關鍵字比較?
- contentView 是指 UIScrollView上顯示內容的區(qū)域,用戶 addSubView 都是在 contentView上進行的;
- contentInset 是指 contentView與 UIScrollView的邊界;
- contentSize 是指 contentView 的大小,表示可以滑動范圍;
- contentOffset 是當前 contentView 瀏覽位置左上角點的坐標;
40. 圖片png與jpg的區(qū)別是什么?
png:
優(yōu)點:無損格式纹份,不論保存多少次苟跪,理論上圖片質量都不會受任何影響;支持透明
缺點:尺寸過大蔓涧;打開速度與保存速度和jpg沒法比-
jpg:
優(yōu)點:尺寸較小件已,節(jié)省空間;打開速度快
缺點:有損格式元暴,在修圖時不斷保存會導致圖片質量不斷降低篷扩;不支持透明在開發(fā)中,尺寸比較大的圖片(例如背景圖片)一般適用jpg格式昨寞,減小對內存的占用瞻惋!
收錄 | 原文地址
結語
再次說一聲厦滤,對于答案援岩,不一定都合適歼狼,歡迎大家積極討論;整理不易享怀,如果您覺得還不錯羽峰,麻煩在文末 “點個贊” ,或者留下您的評論“Mark” 一下添瓷,謝謝您的支持