iOS程序員面試分類模擬9_第1頁
iOS程序員面試分類模擬9_第2頁
iOS程序員面試分類模擬9_第3頁
iOS程序員面試分類模擬9_第4頁
iOS程序員面試分類模擬9_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

iOS程序員面試分類模擬9簡答題1.

UIView和CALayer的區(qū)別與聯(lián)系是什么?正確答案:1.UIView和CALayer是什么?

CALayer是動畫中經常使用的一個類,它包含在Qu(江南博哥)anzCore框架中。CALayer類在概念上和UIView類似,同樣是一些被層級關系樹管理的矩形塊,也可以包含一些內容(像圖片、文本或者背景色),管理子圖層的位置。它們有一些方法和屬性用來做動畫和變換。使用CoreAnimation開發(fā)動畫的本質就是將CALayer中的內容轉化為位圖供硬件操作。

CALayer是一個比UIView更底層的圖形類,是對底層圖形API(OpenGLES)一層層封裝后得到的一個類,用于展示一些可見的圖形元素,保留了一些基本的圖形化操作,但同時由于相對高度的封裝,使得操作使用變得很簡單。CALayer用于管理圖形元素,甚至可以制作動畫,它保留了一些幾何屬性,如位置、尺寸、圖形變換等。一般的CALaver是作為UIView背后的支持角色,在創(chuàng)建了一個UIViewr的同時也存在一個相應的CALayer。UIView作為CALayer的代理角色去實現(xiàn)一些功能,例如常見的為UIView制作一個圓角,就會用到UIView背后的layer操作:

view.layer.cornerRadius=10;

CALayer可以通過UIView很方便地展示操作UI元素,但是CALayer自身單獨也可以展示和操作可見元素,且靈活度更高,它自身有一些可見可設置的屬性,如背景色、邊框、陰影等。

另外,UIView簡單來說是一個可以在里面渲染可見內容的矩形框,它里面的內容可以和用戶進行交互,UIView可以對交互事件進行處理。除了其背后CALayer的圖形操作支持,UIView自身也有像設置背景色等最基本的屬性設置。

2.UIView和CALayer的聯(lián)系

UIView和CALayer的主要聯(lián)系上面已經提到,CALayer在UIView背后提供更加豐富靈活的圖形操作,UIView作為CALayer的代理更加快速地幫CALayer顯示一些常用的UI元素并提供交互。

另外,UIView類是所有視圖的基類,CALayer是圖層類。事實上,UIView和CAlayer是平行的層級關系。每一個UIView都有一個CALayer實例的圖層屬性,視圖的責任就是創(chuàng)建并管理圖層,以確保當子視圖在層級關系中被添加或者被移除的時候,與它們相關聯(lián)的圖層也同樣在層級關系樹中有相同的操作。

3.UIView和CALayer的區(qū)別

1)CALayer無法響應用戶事件。UIView和CALayer的最明顯區(qū)別在于它們的可交互性,即UIViewr可以響應用戶事件,而CALayer不可以,原因可以從這兩個類的繼承關系上看出(見圖)。UIView是繼承自UIResponder的,決定了UIView類及其子類能夠通過響應鏈(iOS通過視圖層級關系來傳遞觸摸事件)接收并響應用戶事件。而CALayer直接繼承于NSObject類,所以它不清楚具體的響應鏈,也就無法響應用戶事件。

CALayer和UIView繼承關系

2)分工不同。UIView類側重于對顯示內容的管理和整體布局,而CALayer側重于顯示內容的繪制、顯示和動畫。

3)所屬框架不同。UIView類是屬于UIKit.framework框架的,UIKit框架主要就是用來構建用戶界面的。CALayer類是屬于QuartzCore.framework框架的,而且CALayer是作為一個低級的,可以承載繪制內容的底層對象出現(xiàn)在該框架的。

2.

為什么iOS中提供UIView和CALayer這兩個平行的層級結構呢?正確答案:iOS中提供UIView和CALayer這兩個平行層級結構主要是為了做到職責分離,實現(xiàn)視圖的繪制、顯示和布局解耦,避免很多重復的代碼。在iOS和MacOS兩個平臺上,事件和用戶交互有很多地方并不相同,畢竟基于多點觸控的用戶界面和基于鼠標鍵盤有著本質的區(qū)別,這就是為什么iOS有UIKit和UIView,但是MacOS有Appkit和NSView的原因。它們功能雖然相似,但是在實現(xiàn)上有著顯著的區(qū)別。創(chuàng)建兩個層次結構就能夠在iOS與MacOS之間共享代碼,從而使得開發(fā)更加便捷。

3.

UIWindow是什么?有什么特點和作用?正確答案:從下圖中的繼承關系會發(fā)現(xiàn)UIWindow居然是UIView的子類,因為UIWindow在應用中是作為根視圖來承載UIViewr元素的,也就是說根父視圖是子視圖的子類,有點違背直覺。

CALayer和UIView繼承關系

但事實就是這樣,UIWindow提供一個區(qū)域(一般就是整個屏幕)來顯示UIView,并且將事件分發(fā)給UIView。一個應用一般只有一個UIWindow,但特殊情況也會創(chuàng)建子UIWindow,例如實現(xiàn)一個始終漂浮在頂層的懸浮窗,就可以使用一個UIWindow來實現(xiàn)。

4.

什么是Layer層對象?正確答案:Layer層對象是用來展示可見內容的一種數據對象,常在視圖中用來渲染視圖內容。一般的層對象在界面中可以實現(xiàn)一些復雜的動畫或者其他類型的一些復雜特效。

常見的幾個其自身具有繪制功能的專用Layer有:CATextLayer、CAShapeLayer、CAGradientLayer,這里給出使用示例。其他還有用于3D圖形變換的CATransformLayer,實現(xiàn)滾動視圖的CAScrollLayer,專門播放視頻的AVPlayerLayer和制作粒子特效的CAEmitterLayer等。它們都是繼承自CALayer的,和CALayer一樣都來自QuartzCore.framework框架。

1.CATextLayer

這個類是用來實現(xiàn)更加靈活的文字布局和渲染的,它幾乎包含了UILabe1的所有特性并在此基礎上增加了很多更強大的功能,包括字體、尺寸、前景色和下畫線等文字效果,同時CATextLayer的渲染效率明顯高于UILabel。

通過CALayer來實現(xiàn)一個UILabel的示例代碼如下(效果見圖):

-(void)viewDidLoad{

[superviewDidLoad];

/*創(chuàng)建一個字符承載視圖*/

UIView*textView=[[UIViewalloc]initWithFrame:CGRectMake(50,50,200,50)];

CATextLayer*text=[CATextLayerlayer];

text.frame=textView.frame;

text.string=@"CAText";

/*文字前景色和背景色*/

text.foregroundColor=[UIColorwhiteColor].CGColor;

text.backgroundColor=[UIColorblackColor].CGColor;

/*文字超出視圖邊界裁剪*/

text.wrapped=YES;

/*文字字體*/

text.font=(__bridgeCFTypeRef)[UIFontsystemFontOfSize:30].fontName;

/*文字居中*/

text.alignmentMode=kCAAlignmentCenter;

/*適應屏幕Retina分辨率,防止像素化導致模糊*/

text.contentsScale=[[UIScreenmainScreen]scale];

[textView.layeraddSublayer:text];

[self.viewaddSubview:textView];

}

CATextLayer效果

2.CAShapeLayer

這個類是用來專門繪制矢量圖形的圖形子類,例如可以指定線寬和顏色等利用CGPath繪制圖形路徑,可以實現(xiàn)圖形的3D變換效果,渲染效率比CoreGraphics快很多,而且可以在超出視圖邊界之外繪制,即不會被邊界裁減掉。

這里展示使用CAShapeLayer繪制一個圓形的實例代碼如下(效果見圖):

-(void)viewDidLoad{

[superviewDidLoad];

/*創(chuàng)建圓形路徑*/

UIBezierPath*path=[[UIBezierPathalloc]init];

/*起點要在圓心水平右側半徑長度處*/

[pathmoveToPoint:CGPointMake(200,100)];

/*添加圓形弧路徑*/

[pathaddAreWithCenter:CGPointMake(150,100)radius:50startAngle:0endAngle:2*M_PIclockwise:YES];

/*創(chuàng)建圖形層*/

CAShapeLayer*layer=[CAShapeLayerlayer];

/*路徑線的顏色*/

layer.strokeColor=[UIColorredColor].CGColor;

/*閉合圖形填充色,這里設置透明*/

layer.fillColor=[UIColorclearColor].CGColor;

/*線寬*/

layer.lineWidth=10;

/*線的樣式:端點、交點*/

layer.lineCap=kCALineCapRound;

layer.lineJoin=kCALineJoinRound;

/*設置圖形路徑*/

layer.path=path.CGPath;

[self.view.layeraddSublayer:layer];

}

@end

CAShapeLayer繪制效果

3.CAGradientLayer

它是一個硬件加速的高性能繪制圖層,主要用來實現(xiàn)多種顏色的平滑漸變效果。這里給出一個3種顏色從正方形左上角到右下角的漸變效果示例代碼(效果見圖6):

-(void)viewDidLoad{

[superviewDidLoad];

/*創(chuàng)建layer承載視圖*/

UIView*containerView=[[UIViewalloc]initWithFrame:CGRectMake(50,50,150,150)];

CAGradientLayer*layer=[CAGradientLayerlayer];

layer.frame=containerView.bounds;

/*依次設置漸變顏色數組*/

layer.colors=@[(__bridgeid)[UIColorgreenColor].CGColor,(__bridgeid)[UIColoryellowColor].CGColor,(__bridgeid)[UIColororangeColor].CGColor];

/*顏色從起點到終點按比例分段位置*/

layer.locations=@[@0,0,@0.3,@0.5];

/*顏色漸變的起點和終點:(0,0)~(1,1)表示左上角到右下角*/

layer.startPoint=CGPointMake(0,0);

layer.endPoint=CGPointMake(1,1);

[containerView.layeraddSublayer:layer];

[self.viewaddSubview:containerView];

}

CAGradientLayer繪制效果

5.

如何使用CAShapeLayer繪制圖層?正確答案:CAShapeLayer是一個通過矢量圖形來進行繪制的圖層子類。開發(fā)者通過指定諸如顏色和線寬等屬性,用CGPath來定義指定形狀的圖形,最后CAShapeLayer對象就會自動渲染出來了。與直接使用CoreGraphics在原始的CALayer對象中繪制的方式相比,使用CAShapeLayer有以下優(yōu)點:

1)渲染速度更快。CAShapeLayer使用了硬件加速的方式繪制圖形,繪制速度比用CoreGraphics快很多。

2)內存使用更加高效。普通的CALayer對象需要創(chuàng)建一個寄宿圖,而CAShapeLayer不需要,這樣就節(jié)約了內存。

3)不會被邊界圖層裁剪掉。一個CAShapeLayer可以在圖層邊界繪制。CAShapeLayer的圖層路徑不會像在使用CoreGraphics的普通CALayer一樣被裁剪掉。

通常通過指定CAShapeLayer對象的path屬性來繪制圖層。代碼如下:

@property(nullable)CGPathRefpath;

此外還可以通過一些屬性來描繪形狀的線條,例如lineWidth屬性用于設置線寬,lineCap屬性用于描繪線條結尾的樣子,但是在圖層層面只有一次機會設置這些屬性。如果想用不同顏色或風格來繪制多個形狀,那么就不得不為每個形狀準備一個圖層。下面示例使用CAShapeLayer渲染一個簡單的多邊形,由于CAShapeLayer對象的path屬性是CGPathRef類型,所以很容易使用UIBezierPath類幫助創(chuàng)建圖層路徑,這樣就不需要人工釋放CGPath了。代碼如下:

/*創(chuàng)建一個CAShapeLayer對象*/

CAShapeLayer*shaperLayer=[CAShapeLayerlayer];

/*設置線寬*/

shaperLayer.lineWidth=2;

shaperLayer.lineCap=kCALineCapRound;

shaperLayer.lineJoin=kCALineJoinRound;

/*設置描邊顏色*/

shaperLayer.strokeColor=[UIColorredColor].CGColor;

/*設置填充顏色*/

shaperLayer.fillColor=[UIColorwhiteColor].CGColor;

/*創(chuàng)建一個UIBezierPath對象*/

UIBezierPath*bezierPath=[UIBezierPathbezierPath];

[bezierPathmoveToPoint:CGPointMake(160,100)];

[bezierPathaddLineToPoint:CGPointMake(100,160)];

[bezierPathaddLineToPoint:CGPointMake(100,220)];

[bezierPathaddLineToPoint:CGPointMake(160,280)];

[bezierPathaddLineToPoint:CGPointMake(220,220);

[bezierPathaddLineToPoint:CGPointMake(220;160)];

[bezierPathclosePath];

/*繪制*/

shaperLayer.path=bezierPath.CGPath;

[self.view.layeraddSublayer:shaperLayer];

代碼執(zhí)行效果如圖所示。

CAShapeLayer繪制的路徑圖

6.

iOS中如何實現(xiàn)為UIImageView添加圓角?正確答案:圓角指按照一定圓角半徑平滑矩形視圖的4個角的效果,如圖所示。

圓角效果

按照背后的渲染方式,實現(xiàn)UIView及其子類的圓角效果有兩種方法:一種是直接設置layer的圓角屬性,為“離屏渲染”;另一種是自定義圓角繪制方法,實現(xiàn)“當前屏幕渲染”。

當前屏幕渲染(On-screenRendering)指GPU直接在當前顯示的屏幕緩沖區(qū)中進行圖形渲染,不需要提前另開緩沖區(qū)也就不需要緩沖區(qū)的切換,因此性能較高。

離屏渲染(Off-screenRendeiing):簡單來說就是提前另開一個緩沖區(qū)進行圖形渲染,由于顯示需要和當前屏幕緩沖區(qū)進行切換,所以很耗費性能。通常圓角、遮罩、不透明度、陰影、漸變、光柵化和抗鋸齒等設置都會觸發(fā)離屏渲染。

(1)“離屏渲染”實現(xiàn)圓角

iOS中圓角效果實現(xiàn)的最簡單、最直接的方式是直接修改View的layer層參數,這樣會觸發(fā)“離屏渲染”,性能不高。

/*設置圓角半徑*/

view.layer.cornerRadius=5;

/*將邊界以外的區(qū)域遮蓋住*/

view.layer.masksToBounds=YES;

(2)“當前屏幕渲染”實現(xiàn)圓角

直接在當前屏幕渲染繪制,提高性能。

為UIImage類擴展一個實例方法:

/*On-screen-renderring繪制UIImage矩形圓角*/

-(UIImage*)imageWithComerRadius:(CGFloat)radiusofSize:(CGSize)size{

/*當前UIImage的可見繪制區(qū)域*/

CGRectrect=(CGRect){0.f,0.f,size};

/*創(chuàng)建基于位圖的上下文*/

UIGraphicsBeginImageCoritextWithOptions(size,NO,UIScreen.mainScreen.scale);

/*在當前位圖上下文添加圓角繪制路徑*/

CGContextAddPath(UIGraphicsGetCurrentContext0,[UIBezierPathbezierPathWithRoundedRect:rectcomerRadius:radius].CGPath);

/*當前繪制路徑和原繪制路徑相交得到最終裁剪繪制路徑*/

CGContextClip(UIGraphicsGetCurrentContext());

/*繪制*/

[selfdrawInRect:rect];

/*取得裁剪后的image*/

UIImage*image=UIGraphicsGetImageFromCurrentImageContext();

/*關閉當前位圖上下文*/

UIGraphicsEndImageContext();

returnimage;

}

使用時,讓實例化的UIImage對象調用上面的實例方法即可。

UIImageView*imageView=[[UIImageViewalloc]initWithFrame:CGRectMake(10,10,100,100)];

/*創(chuàng)建并初始化UIImage*/

UIImage*image=[UIImageimageNamed:@"icon"];

/*添加圓角矩形*/

image=[imageimageWithComerRadius:50ofSize:imageView.frame.size];

[imageViewsetImage:image];

7.

contentsScale屬性有什么作用?正確答案:圖層的contentsScale屬性屬于支持高分辨率屏幕(如Retina屏幕)機制的一部分,它定義了圖層content中圖像的像素尺寸與視圖大小的比例。它也被用來判斷在繪制圖層時允許為content屬性創(chuàng)建的空間大小,以及需要顯示的圖片的拉伸度。

默認情況下,contentsScale的值是1.0,也就是說圖層的繪制系統(tǒng)將會以每個點對應一個像素來繪制圖片。如果將其設置為2.0,那么會以每個點對應兩個像素來繪制圖片,此即所謂的Retina屏幕。

在開發(fā)中,有時會直接為圖層的content設置圖片,這時可以設置contentsScale為合適的值,以防止圖片在Retina屏幕上顯示不正確(像素化或模糊),代碼如下:

layer.contentsScale=[UIScreenmainScreen].scale;

8.

iOS中點與像素有什么關系?正確答案:1)點是iOS中標準的坐標體系。它就是iOS中的虛擬像素,也被稱為邏輯像素。在標準設備中,一個點就是一個像素,但是在Ratina屏幕上,一個點等于2×2個像素。iOS用點作為屏幕的坐標測算體系就是為了在Retina設備和普通設備上能有一致的視覺效果。

2)像素是圖片分辨率的尺寸單位。物理像素坐標并不會用于屏幕布局,但是仍然和圖片有相對關系。UIImage是一個屏幕分辨率解決方法,它是用點來度量大小的。但是,一些底層的CGImage類型的圖片會使用像素,所以必須清楚在Retina設備和普通設備上,點和像素代表著不同的大小。

9.

如何理解anchorPoint和position的作用?正確答案:在UIView中有3個比較重要的布局屬性:frame、bounds和center,它們分別對應于CALayer中的frame、bounds和position。雖然圖層使用position,而視圖使用了center,但是這兩個屬性都代表了同樣的值,即當前圖層的anchorPoint點相對于父圖層的位置。

anchorPoint被稱為“錨點”。圖層的anchorPoint屬性通過影響position的值來控制它的frame,可以將anchorPoint比作控制圖層移動的“支點”。anchorPoint是使用單位坐標來描述的,也就是圖層的相對坐標,圖層左上角是{0,0},右下角是{1,1}。anchorPoint默認的坐標是{0.5,0.5},即圖層的中心點。

position等價于視圖中的center,它代表了anchorPoint點在父圖層(superLayer)的位置。因此可以說,position點是相對于父圖層坐標系的,而anchorPoint是相對于當前圖層的,兩者是相對于不同的坐標系的一個重合點。

事實上,position和anchorPoint的值是互不影響的,也就是說修改其中任何一個的值,另外一個的值不會改變,改變的只是當前圖層的frame。對于視圖或者圖層來說,frame并不是一個非常清晰的屬性,它其實是一個虛擬屬性,是根據bounds、position和transform計算而來的,當其中任何一個值發(fā)送改變時,frame都會變化。相反,改變frame的值同樣也會影響它們的值。frame、position和anchorPoint的關系可以用如下公式表達:

frame.origin.x=position.x-anchorPoint.x*bounds.size.width;

frame.origin.y=position.y-anchorPoint.y*bounds.size.height;

在制作動畫時,視圖默認是圍繞中心點進行旋轉或平移的,這是因為默認UIView的rootLayer的anchorPoint就是圖層的中心。在實際開發(fā)中,可能需要改變anchorPoint以達到其他的效果,如下示例代碼演示了類似于播放器的效果(界面見圖)。當單擊屏幕時,臂桿能夠圍繞頂部旋轉,storyboard中的代碼如下:

/*控制器代碼如下*/

@interfaceAnimation(){

__weakIBOutletUIImageView*_needle;

BOOL_playing;//設置一個布爾值來控制下降或上升

}

@end

@implementationAnimation

-(void)viewDidLoad{

[superviewDidLoad];

}

-(void)viewDidAppear:(BOOL)animated{

[superviewDidAppear:animated];

/*改變視圖的錨點和position*/

/*如果僅僅改變錨點,那么_needle視圖將會下移*/

_needle.layer.anchorPoint=CGPointMake(0.5,0);

needle.layer.position=CGPointMake(needle.superview.frame.size.width*0.5,0);

_needle.transform=CGAffineTransformRotate(_needle.transform,M_PI/12);

}

/*單擊屏幕,移動臂桿*/

/*當然也可以添加一些動畫,使得臂桿的動作更自然,但此處主要是為了演示anchorPoint和position的作用*/

-(void)touchesBegan:(NSSet<UITouch*>*)toucheswithEvent:(UIEvent*)event

if(!_playing){

_needle.transform=CGAffineTransformIdentity;

}else{

_needle.transform=CGAffineTransformRotate(_needle.transform,M_PI/12);

}

_playing=!_playing;

}

播放器效果

10.

如何理解drawRect:方法?正確答案:iOS的繪圖操作是發(fā)生在UIView類的drawRect:方法中的。如果想在UIView中繪圖,那么可以通過繼承UIView類并實現(xiàn)其drawRect:方法,在drawRect:方法中獲取當前的環(huán)境上下文(context)進行繪制。drawRect:方法被定義在UIView的UIViewRendering類別中:

-(void)drawReet:(CGRect)rect;

drawRect:里面的代碼利用CoreGraphics在指定的rect中繪制圖形,然后內容就會被緩存起來直到它需要被更新。事實上,蘋果公司并不建議開發(fā)者主動調用drawRect:方法,當然如果強制直接調用該方法,那么也是沒有效果的,因為系統(tǒng)此時不會自動創(chuàng)建和View相關聯(lián)的上下文。而且當沒有自定義繪制任務時,就不要在子類中寫一個空的drawRect:,否則會造成CPU資源和內存的浪費。

當視圖在屏幕中出現(xiàn)的時候,drawRect:方法就會被自動調用。具體是,drawRect:方法的第一次調用是在控制器中l(wèi)oadView和viewDidLoad兩方法之后。所以不必擔心在控制器初始化之前,drawRect:就會被執(zhí)行。雖然drawRect:是UIView類中的方法,但事實上都是底層的CALayer對象安排了重繪工作并保存了繪制好的內容。

另外,可以調用setNeedsDisplay:方法將繪制好的圖形更新到視圖上。setNeedsDisplay:方法就是在receiver上設置一個需要被重新繪制的標記,在下一個繪制周期自動進行重繪,一般iPhone的刷新頻率為60Hz,也就是說1/60s后重繪。示例代碼如下:

-(void)drawRect:(CGRect)rect{

/*獲取上下文*/

CGContextRefctx=UIGraphicsGetCurrentContext();

/*繪制一個圓形*/

CGContextAddEllipseInRect(ctx,CGRectMake(0,0,200,200));

/*設置顏色*/

[[UIColorredColor]set];

/*填充*/

CGContextFillPath(ctx);

}

11.

如何使用mask屬性實現(xiàn)圖層蒙版功能?正確答案:在實際開發(fā)中,通常使用mask屬性來實現(xiàn)圖層蒙版的功能。這個屬性本身就是CALayer類型,它和其他圖層一樣擁有繪制和布局的屬性。但不同于那些繪制在父圖層中的子圖層,mask圖層定義了父圖層的部分可見區(qū)域。

mask圖層中最重要的是圖層的輪廓,在父圖層中,與mask圖層相重疊的部分將被保留,其他的部分將被遮蓋。也就是說,父圖層提供內容,而mask圖層提供形狀。事實上,mask圖層不僅僅局限于靜態(tài)圖,還可以使用代碼或者動畫實時地生成。

示例代碼如下:

-(void)viewDidLoad{

[superviewDidLoad];

/*設置寄宿圖*/

self.view.layer.contents=(id)[UIImageimageNamed:@"海水"].CGImage;

/*設置寄宿圖的顯示模式,等價于UIView的contentMode*/

self.view.layer.contentsGravity=@"resizeAspect";

/*設置mask層*/

UIImageView*searchImageView=[[UIImageViewalloe]initWithFrame:CGRectMake(([UIScreenmainScreen].bounds.size.width-150)*0.5,([UIScreenmainScreen].bounds.size.height-150)*0.5,150,150)];

searchImageView.image=[UIImageimageNamed:@"馬"];

self.view.layer.mask=searchImageView.layer;

}

代碼執(zhí)行的效果如圖所示。

圖層蒙版效果

12.

如何解決masksToBounds離屏渲染帶來的性能損耗?正確答案:在開發(fā)中常通過CALayer的cornerRadius屬性來設置圖層的圓角曲率(如設置圓角圖片)。默認情況下,cornerRadius只影響背景顏色而不影響背景圖片或子圖層。但當將CALayer的masksToBounds設置為YES時,圖層的內容就會被截取。代碼如下:

imageView.layer.cornerRadius=10

imageView.layer.masksToBounds=YES

由于這樣處理的渲染機制是GPU在當前屏幕緩沖區(qū)外新開辟的一個渲染緩沖區(qū)進行工作,也就是所謂的離屏渲染,所以這會給應用程序帶來額外的性能損耗。如果在某一時刻大量地使用這種方式設置圓角,那么就會觸發(fā)緩沖區(qū)頻繁合并和上下文之間的頻繁切換,這時應用程序就有可能出現(xiàn)掉幀和卡頓。具體可以使用Xcode自帶的Instruments(工具)進行檢測。

為了防止因離屏渲染而產生性能損耗,可以不使用CALayer的cornerRadius和masksToBounds屬性,而將處理圖片的權利交于CPU,雖然CPU對圖形的處理能力不及GPU,但設置圓角圖片的處理難度并不大,且代價遠小于上下文切換。以下是實際開發(fā)中常用的兩種優(yōu)化方案:

1)使用CALayer提供的shouldRasterize屬性。shouldRasterize屬性是設置光柵化,可以使離屏渲染的結果緩存到內存中存為位圖,當下次

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論