原標題:最新整理:iOS面試題-常問UI問題(四)

前言:

最近把 iOS 面試中可能會遇到的問題整理了一番, 題目大部分是網上收錄的, 方便自己鞏固複習, 也分享給大家; 希望對大家有所幫助!

  • 對於答案,不一定都合適,歡迎大家積極討論;整理不易,如果您覺得還不錯,麻煩在文末 “點個贊” ,或者留下您的評論“Mark” 一下,謝謝您的支持

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所沒有的交互接口,主要負責處理用戶觸發的各種操作;
  • CALayer主要負責繪製,在圖像和動畫上渲染性能更好;

3.UIView 的frame,bounds,center

  • frame: 描述當前界面元素在其父界面元素中的位置和大小。
  • bounds: 描述當前界面元素在其自身座標系統中的位置和大小。
  • 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 也無法監聽一些事件,手勢刷新UI等操作
  • 在子線程更新UI可能會無效,也可能會崩潰

精選全網 · iOS面試題答案PDF文集

  • 獲取加小編的iOS技術宮重號:編程大鑫,直接獲取

6. 如何處理UITableVier 中Cell 動態計算高度的問題,都有哪些方案

  • 你的Cell要使用AutoLayout來佈局約束這是必須的;設置tableview的estimatedRowHeight爲一個非零值,這個屬性是設置一個預估的高度值,不用太精確。 設置tableview的rowHeight屬性爲UITableViewAutomaticDimension
  • 第三方 UITableView+FDTemplateLayoutCell(計算佈局高度緩存的)
  • 手動計算每個控件的 高度並相加,最後緩存高度

7. AutoLayout 中的優先級是什麼?

AutoLayout中添加的約束也有優先級,優先級的數值是1~1000

  • 一種情況是我們經常添加的各種約束,默認的優先級是1000,也就是最高級別,條件允許的話系統會滿足我們所有的約束需求。
  • 另外一種情況就是固有約束(intinsic content size)
  • Content Hugging Priority 抗拉伸優先級值越小,越容易被拉伸
  • Content Compression Resistance 抗壓縮優先級 優先級越小,越先被壓縮

8. 怎麼高效的實現控件的圓角效果?

//直接對圖片進行重繪 (使用Core Graphics),實際開發加異步處理,也可以給 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如何添加點擊事件

  1. 通過 touchesBegan: withEvent 方法,監聽屏幕點擊事件,在這個方法中通過 convertPoint 找到點擊位置,進行判斷,如果點擊了 layer 視圖內座標,就觸發點擊事件
  2. 通過 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不會觸發調用
  • addSubview會觸發調用
  • 改變view的width和height的時候回觸發調用
  • 一個UIScrollView滾動會觸發調用
  • 旋轉screen會觸發調用
  • 改變一個UIView大小的時候會觸發superView的layoutSubviews事件
  • 直接調用setLayoutSubviews會觸發調用
  • -(void)viewWillAppear:(BOOL)animated會觸發一次調用
  • -(void)viewDidAppear:(BOOL)animated 看情況,可能有調用
  • drawRect調用情況
  • 如果UIView沒有設置frame大小,直接導致drawRect不能被自動調用。
  • drawRect在loadView和viewDidLoad這兩個方法之後調用
  • 調用sizeToFit後自動調用drawRect
  • 通過設置contentMode值爲UIViewContentModeRedraw。那麼每次設置或者更改frame自動調用drawRect。
  • 直接調用setNeedsDisplay或者setNeedsDisplayInRect會觸發調用

11. layoutIfNeeded , layoutSubViews和 setNeedsLayout區別?

  • layoutIfNeeded 方法一點被調用,主線程會立即強制重新佈局,它會從當前視圖開始,一直到完成所有子視圖的佈局
  • layoutSubViews 用來自定義視圖尺寸,他是系統自動調用的,開發者不能手動調用,可以重寫改方法,讓系統在調整佈局時候按照我們希望的方式進行佈局.這個方法在旋轉屏幕,滑動或者觸摸屏幕,修改子視圖時候被觸發.
  • setNeedsLayout 和 layoutIfNeeded相似,唯一不同的是他不會立即強制視圖重新佈局,而是在下一個佈局週期纔會觸發更新.他主要用於多個視圖佈局先後更新的場景;

12.假如Controller太臃腫,如何優化?

  1. 將網絡請求抽象到單獨的類中,方便在基類中處理公共邏輯;方便在基類中處理緩存邏輯,以及其它一些公共邏輯;方便做對象的持久化。
  2. 將界面的封裝抽象到專門的類中, 構造專門的 UIView 的子類,來負責這些控件的拼裝。這是最徹底和優雅的方式,不過稍微麻煩一些的是,你需要把這些控件的事件回調先接管,再都一一暴露回 Controller。
  3. 構造 ViewModel, 借鑑MVVM。具體做法就是將 ViewController 給 View 傳遞數據這個過程,抽象成構造 ViewModel 的過程。
  4. 專門構造存儲類,專門來處理本地數據的存取。
  5. 整合常量

13.程序啓動過程

main 函數執行前:

  1. 首先當程序啓動時,系統會讀取程序的可執行文件(mach-o), 從裏面獲取動態加載器(dylb)的路徑;
  2. 加載dylb, dylb會初始化運行環境,配合ImageLoader將二進制文件加載到內存中去;
  3. 動態鏈接依賴庫, 初始化依賴庫,初始化 runtime;
  4. runtime 會對項目中的所有類進行類結構初始化,調用所有的 load 方法;
  5. 最後 dylb 會返回 main 函數地址,main 函數被調用,進入程序入口

main 函數執行後:

  1. 內部會調用 UIApplicationMain 函數,創建一個UIApplication對象和它的代理,就是我們項目中的 Appdelegate 類
  2. 開啓一個事件循環(main runloop), 監聽系統事件
  3. 程序啓動完畢時,通知代理Appdelegate, 調用 didFinishLaunching 代理方法,在這裏會創建 UIWindow,設置它的rootViewController,
  4. 最後調用 self.window makeKeyAndVisable顯示窗口

14.渲染以及圖像顯示原理過程?

  • 每一個UIView都有一個layer,每一個layer都有個content,這個content指向的是一塊緩存,叫做backing store。
  • UIView的繪製和渲染是兩個過程,當UIView被繪製時,CPU執行drawRect,通過context將數據寫入backing store。
  • 當backing store寫完後,通過render server交給GPU去渲染,將backing store中的bitmap數據顯示在屏幕上。
  • 說到底CPU就是做繪製的操作把內容放到緩存裏,GPU負責從緩存裏讀取數據然後渲染到屏幕上。

15.離屏渲染是什麼

  • 離屏渲染,指的是 GPU (圖形處理器)在當前屏幕緩衝區以外新開闢一個緩衝區進行渲染操作。爲什麼離屏這麼耗時?原因主要有創建緩衝區和上下文切換。創建新的緩衝區代價都不算大,付出最大代價的是上下文切換。
  • GPU屏幕渲染有兩種方式:
  • On-Screen Rendering (當前屏幕渲染) 指的是GPU的渲染操作是在當前用於顯示的屏幕緩衝區進行。
  • Off-Screen Rendering (離屏渲染) 指的是在GPU在當前屏幕緩衝區以外開闢一個緩衝區進行渲染操作。

16. 那些情況會造成離屏渲染?

  1. 爲圖層設置遮罩(layer.mask)
  2. 將圖層的layer.masksToBounds / view.clipsToBounds屬性設置爲true
  3. 將圖層layer.allowsGroupOpacity屬性設置爲YES和layer.opacity小於1.0
  4. 爲圖層設置陰影(layer.shadow *)。
  5. 爲圖層設置layer.shouldRasterize=true
  6. 具有layer.cornerRadius,layer.edgeAntialiasingMask,layer.allowsEdgeAntialiasing的圖層
  7. 文本(任何種類,包括UILabel,CATextLayer,Core Text等)。

17.手機適配方案

  1. 使用宏,針對不同的設備抽取導航,狀態欄,以及 tabbar 高度信息
  2. 寬高等比適配(X 的特殊處理)
  3. 圖片美工需要提供@2x,@3x進行適配
  4. 字體根據屏幕大小適配
  5. 權限針對不同系統進行適配
  6. api 適配

18. 什麼是懶加載?

懶加載 也叫做 延遲加載,他的核心思想就是把對象的實例化儘量延遲,在需要使用的時候纔會初始化,這樣做的好處可以減輕大量對象實例化對資源的消耗.

另外懶加載把對象的實例化代碼抽取出來獨立出來,提高代碼的可讀性,以便代碼更好的被組織

19.什麼是響應者鏈?

響應者鏈是用於確定事件響應的一種機制, 事件主要是指觸摸事件(touch Event),該機制與UIKIT中的UIResponder類密切相關,響應觸摸事件的必須是繼承自UIResponder的類,比如UIView 和UIViewController

一個事件響應者的完成主要分爲2個過程: hitTest方法命中視圖和響應者鏈確定響應者; hitTest的調用順序是從UIWindow開始,對視圖的每個子視圖依次調用,也可以說是從顯示最上面到最下面,直到找命中者; 然後命中者視圖沿着響應者鏈往上傳遞尋找真正的響應者.

事件傳遞過程

  • 當我們觸控手機屏幕時系統便會將這一操作封裝成一個UIEvent放到事件隊列裏面,然後Application從事件隊列取出這個事件,接着需要找到命中者, 所以開始的第一步應該是找到命中者, 那麼又是如何找到的呢?那就不得不引出UIView的2個方法:

// 返回能夠相應該事件的視圖

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

// 查看點擊的位置是否在這個視圖上

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

  • 尋找事件的命中視圖是通過對視圖調用hitTest和pointInside完成的 hitTest的調用順序是從UIWindow開始,對視圖的每個子視圖依次調用,也可以說是從顯示最上面到最下面 遍歷直到找到命中視圖;

響應鏈傳遞

  • 找到命中者,任務並未完成,因爲命中者不一定是事件的響應者,所謂響應就是開發中爲事件綁定一個觸發函數,事件發生後,執行響應函數里的代碼
  • 找到命中視圖後事件會從此視圖開始沿着響應鏈nextResponder傳遞,直到找到處理事件的響應視圖,如果沒有處理的事件會被丟棄。
  • 如果視圖有父視圖則nextResponder指向父視圖,如果是根視圖則指向控制器,最終指向AppDelegate, 他們都是通過重寫nextResponder來實現。
  • 自下往上查找

無法響應的事件情況

  • Alpha=0、
  • 子視圖超出父視圖的情況、
  • userInteractionEnabled=NO、
  • hidden=YES

精選全網 · iOS面試題答案PDF文集

  • 獲取加小編的iOS技術宮重號:編程大鑫,直接獲取

20.動畫相關有哪幾種方式?

  • UIView animation --- 可以實現基於 UIView 的簡單動畫,他是CALayer Animation封裝,可以實現移動,旋轉,變色,縮放等基本操作,他實現的動畫無法回撤,暫停,與手勢交互,常用方法如下

[UIView animateWithDuration: 10 animations:^{

// 動畫操作

}];

  • UIViewPropertyAnimator --- 是 iOS10 中引入的處理交互式動畫接口,他是基於 UIView 實現的, 用法同 UIView animation比較類似,增加了一些新的屬性以及方法;
  • CALayer Animation --- 是在更底層CALayer 上的動畫接口, 他可以實現各種複雜的動畫效果, 實現的動畫可以回撤,暫停與手勢交互等,常用的類有以下幾個:

1. CABasicAnimation——基本動畫

2. CAKeyframeAnimation——關鍵幀動畫

與CABasicAnimation的區別是:CABasicAnimation:只能從一個數值(fromValue)變到另一個數值(toValue)CAKeyframeAnimation:會使用一個NSArray保存這些數值

3. CAAnimationGroup——動畫組

動畫組,是CAAnimation的子類,可以保存一組動畫對象,將CAAnimationGroup對象加入層後,組中所有動畫對象可以同時併發運行

4. 轉場動畫——CATransition

CATransition是CAAnimation的子類,用於做轉場動畫,能夠爲層提供移出屏幕和移入屏幕的動畫效果。iOS比Mac OS X的轉場動畫效果少一點。

21. UIScrollView 原理

  • UIScrollView繼承自UIView,內部有一個 UIPanGestureRecongnizer手勢。 frame 是相對父視圖座標系來決定自己的位置和大小,而bounds是相對於自身座標系的位置和尺寸的。改視圖 bounds 的 origin 視圖本身沒有發生變化,但是它的子視圖的位置卻發生了變化,因爲 bounds 的 origin 值是基於自身的座標系,當自身座標系的位置被改變了,裏面的子視圖肯定得變化, bounds 和 panGestureRecognize 是實現 UIScrollView 滑動效果的關鍵技術點。

22. loadView 的作用?

  • loadView 用來自定義 view,只要實現了這個方法,其他通過 xib 或 storyboard 創 建的 view 都不會被加載

23. IBOutlet 連出來的視圖屬性爲什麼可以被設 置成 weak?

  • 因爲父控件的 subViews 數組已經對它有一個強引用

24. 請簡述 UITableViewCell的複用機制

  • 每次創建 cell 的時候通過 dequeueReusableCellWithIdentifier:方法創建 cell,它先到 緩存池中找指定標識的 cell,如果沒有就直接返回 nil
  • 如果沒有找到指定標識的 cell,那麼會通過 initWithStyle:reuseIdentifier:創建一個 cell
  • 當 cell 離開界面就會被放到緩存池中,以供下次複用

25. 使用 drawRect 有什麼影響?

  • drawRect 方法依賴 Core Graphics 框架來進行自定義的繪製
  • 缺點:它處理 touch 事件時每次按鈕被點擊後,都會用 setNeddsDisplay 進行強制
  • 重繪;而且不止一次,每次單點事件觸發兩次執行。這樣的話從性能的角度來 說,對 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區別

  • imageNamed 會自動緩存新加載的圖片,並切重複利用緩存圖片,一般用於App 內經常使用的尺寸不大的圖片
  • imageWithContentsOfFile 根據路徑加載沒有 取緩存和緩存的過程,用於一些大圖,使用完畢會釋放內存

31. View 和 View 傳值方式有哪些

  1. 通過視圖類對外提供的屬性直接傳值
  2. 通過代理傳值
  3. 通過通知傳值
  4. 通過 Block 傳值
  5. 通過NSUserDefault, 不建議

32. 爲什麼iOS提供 UIView 和CAlayer 兩個個平行的層級結構

  • UIView 和CAlayer2個平行的層級結構主要是用於職責分離,實現視圖的繪製,顯示,佈局解耦,避免重複代碼
  • 在iOS 和 Mac OS兩個平臺上,事件和用戶交互有很多不同的地方,創建2個層級結構,可以在2個平臺上共享代碼,從而使得開發快捷.

33. UIWindow是什麼,有什麼特點?

  • UIWindow 繼承自 UIView, 作爲根視圖來裝置 View元素, UIWindow提供一個區域用於顯示UIView,並且將事件分發給 UIView,一般一個應用只有一個 UIWindow;

精選全網 · iOS面試題答案PDF文集

  • 獲取加小編的iOS技術宮重號:編程大鑫,直接獲取

34. 什麼是隱式動畫和顯示動畫

  • 隱式動畫是系統框架自動完成的。Core Animation在每個runloop週期中自動開始一次新的事務,即使你不顯式的用[CATransaction begin]開始一次事務,任何在一次runloop循環中屬性的改變都會被集中起來,然後做一次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相比,有哪些優缺點

優點:

  • 簡單直接快速, 通過拖拽和點選即可配置UI,界面所見即所得
  • 在 Storybord可以清楚的區分ViewController 界面之間的跳轉關係

缺點:

  • 協作衝突,多人編輯時,容易發生衝突,很難解決衝突
  • 很難做到界面繼承和重用
  • 不便於進行模塊化管理
  • 影響性能

37. AutoLayout 和 Frame在UI佈局和渲染上有什麼區別?

  • AutoLayout是針對多尺寸屏幕的設計,其本質是通過線性不等式設置UI控件的相對位置,從而適配多種屏幕設備
  • Frame 是基於XY座標軸系統佈局機制,它從數學上限定了UI 控件的具體位置,是 iOS'開發中最低層,最基本的界面佈局方式
  • AutoLayout性能比 Frame 差很多,AutoLayout佈局過程是首先求解線性不等式,然後在轉化爲Frame進行佈局,其中求解計算量非常大,很損耗性能;

38. SafeArea, SafeAreaLayoutGuide, SafeAreaInsets 關鍵詞的比較說明?

由於 iphoneX 採用了劉海設計,iOS11引入了安全區域(SafeArea)概念

  • SafeArea是指App 顯示內容的區域,不包括StatusBar,Navigationbar,tabbar,和 toolbar, 在 iPhoneX 中一般是指扣除了statusBar(44像素),和底部home indicator(高度爲34像素)的區域.這樣操作不會被劉海或者底部手勢影響了.
  • SafeAreaLayoutGuide 是指 Safe Area 的區域範圍和限制, 在佈局設置中,可以取得他的上下左右4個邊界位置進行相應的佈局
  • SafeAreaInsets限定了Safe Area區域與整個屏幕之間的佈局關係,一般用上下左右4個值來獲取 SafeArea 與屏幕邊緣之間的距離;

39. UIScrollView 的 contentView, contentInset, contentSize, contentOffset 關鍵字比較?

  • contentView 是指 UIScrollView上顯示內容的區域,用戶 addSubView 都是在 contentView上進行的;
  • contentInset 是指 contentView與 UIScrollView的邊界;
  • contentSize 是指 contentView 的大小,表示可以滑動範圍;
  • contentOffset 是當前 contentView 瀏覽位置左上角點的座標;

40. 圖片png與jpg的區別是什麼?

  • png:
  • 優點:無損格式,不論保存多少次,理論上圖片質量都不會受任何影響;支持透明
  • 缺點:尺寸過大;打開速度與保存速度和jpg沒法比
  • jpg:
  • 優點:尺寸較小,節省空間;打開速度快
  • 缺點:有損格式,在修圖時不斷保存會導致圖片質量不斷降低;不支持透明
  • 在開發中,尺寸比較大的圖片(例如背景圖片)一般適用jpg格式,減小對內存的佔用!

結語

再次說一聲,對於答案,不一定都合適,歡迎大家積極討論;整理不易,如果您覺得還不錯,麻煩在文末 “點個贊” ,或者留下您的評論“Mark” 一下,謝謝您的支持

相關文章