日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

UIViewController与UIView的关系

發(fā)布時(shí)間:2025/3/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UIViewController与UIView的关系 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
haoxue2010-11-21 21:30

iphone--UIViewController與UIView的關(guān)系

UIView翻轉(zhuǎn)效果實(shí)現(xiàn)
新建一個(gè)view-based模板工程,在ViewController文件中添加下面的代碼,即可實(shí)現(xiàn)翻轉(zhuǎn)效果;
- (void)viewDidLoad {
? ???[super viewDidLoad];
//需要翻轉(zhuǎn)的視圖
UIView *parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, 320, 200)];
parentView.backgroundColor = [UIColor yellowColor];
parentView.tag = 1000;
[self.view addSubview:parentView];
}
//需要在h頭文件聲明下面的動(dòng)作響應(yīng)函數(shù)
//在xib文件中添加一個(gè)button,其響應(yīng)函數(shù)為下面的函數(shù)
//運(yùn)行程序后,點(diǎn)擊button就看到翻轉(zhuǎn)效果
-(IBAction)ActionFanzhuan{
//獲取當(dāng)前畫圖的設(shè)備上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//開始準(zhǔn)備動(dòng)畫
[UIView beginAnimati*****:nil context:context];
//設(shè)置動(dòng)畫曲線,翻譯不準(zhǔn),見蘋果官方文檔?
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//設(shè)置動(dòng)畫持續(xù)時(shí)間
[UIView setAnimationDuration:1.0];
//因?yàn)闆](méi)給viewController類添加成員變量,所以用下面方法得到viewDidLoad添加的子視圖
UIView *parentView = [self.view viewWithTag:1000];
//設(shè)置動(dòng)畫效果
[UIView setAnimationTransition: UIViewAnimationTransitionCurlDown forView:parentView cache:YES]; ?//從上向下
// [UIView setAnimationTransition: UIViewAnimationTransitionCurlUp forView:parentView cache:YES]; ? //從下向上
// [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromLeft forView:parentView cache:YES]; ?//從左向右
// [UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:parentView cache:YES];//從右向左
//設(shè)置動(dòng)畫委托
[UIView setAnimationDelegate:self];
//當(dāng)動(dòng)畫執(zhí)行結(jié)束,執(zhí)行animationFinished方法
[UIView setAnimationDidStopSelector:@selector(animationFinished:)];
//提交動(dòng)畫
[UIView commitAnimati*****];
}
//動(dòng)畫效果執(zhí)行完畢
- (void) animationFinished: (id) sender{
NSLog(@"animationFinished !");
}
運(yùn)行程序,點(diǎn)擊按鈕,就能看到動(dòng)畫效果了。

?????????????????????????????????????

?

haoxue2010-11-21 21:33
UIView的一些基本方法理解:loadView、viewDidLoad、viewDidUnload、viewWillAppear、viewWillDisappear

經(jīng)常使用UIView以及它的子類,一般對(duì)于init:,viewDidLoad:,dealloc:等方法應(yīng)該是比較熟悉和了解的。
對(duì)于其它幾個(gè)基本方法就不那么常用了,為了更好地編程使用這些方法,在此集中收集整理一下各方法調(diào)用的時(shí)機(jī)和作用:

init:方法
在init方法中實(shí)例化必要的對(duì)象(遵從LazyLoad思想)
init方法中初始化ViewController本身



loadView:方法
這是當(dāng)沒(méi)有正在使用nib視圖頁(yè)面,子類將會(huì)創(chuàng)建自己的自定義視圖層。絕不能直接調(diào)用
如果手工維護(hù)views,必須重載重寫該方法。
當(dāng)view需要被展示而它卻是nil時(shí),viewController會(huì)調(diào)用該方法。
loadView和IB構(gòu)建view
你在控制器中實(shí)現(xiàn)了loadView方法,那么你可能會(huì)在應(yīng)用運(yùn)行的某個(gè)時(shí)候被內(nèi)存管理控制調(diào)用。 如果設(shè)備內(nèi)存不足的時(shí)候, view 控制器會(huì)收到didReceiveMemoryWarning的消息。 默認(rèn)的實(shí)現(xiàn)是檢查當(dāng)前控制器的view是否在使用。 如果它的view不在當(dāng)前正在使用的view hierarchy里面,且你的控制器實(shí)現(xiàn)了loadView方法,那么這個(gè)view將被release, loadView方法將被再次調(diào)用來(lái)創(chuàng)建一個(gè)新的view。

viewDidLoad:方法
在視圖加載后被調(diào)用:
如果是在代碼中創(chuàng)建的視圖加載器,他將會(huì)在loadView方法后被調(diào)用;
如果是從nib視圖頁(yè)面輸出,他將會(huì)在視圖設(shè)置好后后被調(diào)用。
重載重寫該方法以進(jìn)一步定制view
在iPhone OS 3.0及之后的版本中,還應(yīng)該重載重寫viewDidUnload來(lái)釋放對(duì)view的任何索引
viewDidLoad后調(diào)用數(shù)據(jù)Model


viewDidUnload:方法
當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法(注:viewController沒(méi)有被dealloc)
內(nèi)存吃緊時(shí),在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無(wú)用內(nèi)存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式
在該方法中將所有IBOutlet(無(wú)論是property還是實(shí)例變量)置為nil(系統(tǒng)release view時(shí)已經(jīng)將其release掉了)
在該方法中釋放其他與view有關(guān)的對(duì)象、其他在運(yùn)行時(shí)創(chuàng)建(但非系統(tǒng)必須)的對(duì)象、在viewDidLoad中被創(chuàng)建的對(duì)象、緩存數(shù)據(jù)等 release對(duì)象后,將對(duì)象置為nil(IBOutlet只需要將其置為nil,系統(tǒng)release view時(shí)已經(jīng)將其release掉了)
一般認(rèn)為viewDidUnload是viewDidLoad的鏡像,因?yàn)楫?dāng)view被重新請(qǐng)求時(shí),viewDidLoad還會(huì)重新被執(zhí)行
viewDidUnload中被release的對(duì)象必須是很容易被重新創(chuàng)建的對(duì)象(比如在viewDidLoad或其他方法中創(chuàng)建的對(duì)象),不要release用戶數(shù)據(jù)或其他很難被重新創(chuàng)建的對(duì)象


dealloc:方法
viewDidUnload和dealloc方法沒(méi)有關(guān)聯(lián),dealloc還是繼續(xù)做它該做的事情


viewWillAppear:?方法
Called when the view is about to made visible. Default does nothing
視圖即將可見時(shí)調(diào)用。默認(rèn)情況下不執(zhí)行任何操作


viewDidAppear:?
Called when the view has been fully transitioned onto the screen. Default does nothing
視圖已完全過(guò)渡到屏幕上時(shí)調(diào)用


viewWillDisappear:
Called when the view is dismissed, covered or otherwise hidden. Default does nothing
視圖被駁回時(shí)調(diào)用,覆蓋或以其他方式隱藏。默認(rèn)情況下不執(zhí)行任何操作


viewDidDisappear:
Called after the view was dismissed, covered or otherwise hidden. Default does nothing
視圖被駁回后調(diào)用,覆蓋或以其他方式隱藏。默認(rèn)情況下不執(zhí)行任何操作

?

lorky_luo2010-11-21 22:08
- (BOOL)CreateFolder
{
????NSFileManager *fileManager = [NSFileManager defaultManager];
????//Get Documents folder
????NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
????NSString *documentDir = [documentPaths objectAtIndex:0];
????//Get Video & Image folder path
????NSString *videoDoc = [NSString stringWithFormat:@"%@/Video",documentDir];
????NSString *imageDoc = [NSString stringWithFormat:@"%@/Image",documentDir];
????
????//Create Video & Image folder at right path
????if ([fileManager fileExistsAtPath:videoDoc]!=YES) {
????????[fileManager createDirectoryAtPath:videoDoc withIntermediateDirectories:YES attributes:nil error:nil];
????}
????if ([fileManager fileExistsAtPath:imageDoc]!=YES) {
????????[fileManager createDirectoryAtPath:imageDoc withIntermediateDirectories:YES attributes:nil error:nil];
????}
????
????// same as above for other six folders.
????return YES;
}

?

haoxue2010-11-21 23:24
iphone--UIViewController與UIView的關(guān)系
UIViewController和Uiview是兩個(gè)不同的類
UIViewController是視圖控制器?
而UIView是視圖
也就是說(shuō),UIViewController是控制UIView的。?
你也可以認(rèn)為UIViewController就是一個(gè)相框?
而UIView就是一個(gè)相片
相框可以隨時(shí)隨地的拿走這個(gè)相片而換另外一張相片
或者在這張相片上加一個(gè)新的相片。而相片
卻不能操縱相框的。?


UIView工作在第一線,向用戶展示表現(xiàn)的內(nèi)容,并接受用戶的交互。UIViewController相當(dāng)于導(dǎo)演,按照計(jì)劃編排屬下的UIView以何種形式展現(xiàn),其中包含一些花哨的技巧,如翻轉(zhuǎn)、淡入淡出等。?
UIVewController的另一個(gè)功能是處理用戶交互操作,注意這里我說(shuō)的是"處理",當(dāng)然UIViewController本身是不知道用戶交互的,這就需要UIView將用戶的交互操作(例如:touchesBegintouchesMoved)傳遞上來(lái)。一般常用的兩種方法完成這種傳遞:?

1、[self nextResponder] touchesBegin:touches...?

2、使用Notification?


不管以何種方式,如果UIViewController得到了用戶的輸入,那么它應(yīng)該對(duì)UIView做些改變以響應(yīng)用戶的輸入,這里要注意UIViewController應(yīng)該只改變UIView的表現(xiàn),而不應(yīng)該處理其它事情,
更多的操作通過(guò)Delegate來(lái)進(jìn)行,關(guān)于Delegate的應(yīng)用場(chǎng)合下次講解消息的傳遞方式中一起闡述。


UIView是一個(gè)視圖,UIViewController是一個(gè)控制器,每一個(gè)viewController管理著一個(gè)view


?

haoxue2010-11-21 23:28
關(guān)于UIView的userInteractionEnabled屬性
如果父視圖為ParentView包含一個(gè)Button,如果再ParentView上添加子視圖ChildView,且ChildView蓋住了Button,那么Button就得到不響應(yīng)了,
為了讓Button響應(yīng),可以設(shè)置ChildView的userInteractionEnabled = NO;最近被這個(gè)問(wèn)題困擾了很久,開始想用事件傳遞的方法,重寫類繼承自UIView,最后被這簡(jiǎn)單屬性搞定了....

?

haoxue2011-10-11 17:27
UIView與CALayer的區(qū)別?
1.UIView是iOS系統(tǒng)中界面元素的基礎(chǔ),所有的界面元素都繼承自它。它本身完全是由CoreAnimation來(lái)實(shí)現(xiàn)的(Mac下似乎不是這樣)。它真正的繪圖部分,是由一個(gè)叫CALayer(Core Animation Layer)的類來(lái)管理。UIView本身,更像是一個(gè)CALayer的管理器,訪問(wèn)它的跟繪圖和跟坐標(biāo)有關(guān)的屬性,例如frame,bounds等等,實(shí)際上內(nèi)部都是在訪問(wèn)它所包含的CALayer的相關(guān)屬性。

2.UIView有個(gè)layer屬性,可以返回它的主CALayer實(shí)例,UIView有一個(gè)layerClass方法,返回主layer所使用的類,UIView的子類,可以通過(guò)重載這個(gè)方法,來(lái)讓UIView使用不同的CALayer來(lái)顯示,例如通過(guò)
1
- (class) layerClass {
2
??return ([CAEAGLLayer class]);
3
}
使某個(gè)UIView的子類使用GL來(lái)進(jìn)行繪制。

3.UIView的CALayer類似UIView的子View樹形結(jié)構(gòu),也可以向它的layer上添加子layer,來(lái)完成某些特殊的表示。例如下面的代碼
1
grayCover = [[CALayer alloc] init];
2
grayCover.backgroundColor = [[[UIColor blackColor] colorWithAlphaComponent:0.2] CGColor];
3
[self.layer addSubLayer: grayCover];
會(huì)在目標(biāo)View上敷上一層黑色的透明薄膜。

4.UIView的layer樹形在系統(tǒng)內(nèi)部,被系統(tǒng)維護(hù)著三份copy(這段理解有點(diǎn)吃不準(zhǔn))。
第一份,邏輯樹,就是代碼里可以操縱的,例如更改layer的屬性等等就在這一份。
第二份,動(dòng)畫樹,這是一個(gè)中間層,系統(tǒng)正在這一層上更改屬性,進(jìn)行各種渲染操作。
第三份,顯示樹,這棵樹的內(nèi)容是當(dāng)前正被顯示在屏幕上的內(nèi)容。
這三棵樹的邏輯結(jié)構(gòu)都是一樣的,區(qū)別只有各自的屬性。

5.動(dòng)畫的運(yùn)作
UIView的主layer以外(我覺(jué)得是這樣),對(duì)它的subLayer,也就是子layer的屬性進(jìn)行更改,系統(tǒng)將自動(dòng)進(jìn)行動(dòng)畫生成,動(dòng)畫持續(xù)時(shí)間有個(gè)缺省時(shí)間,個(gè)人感覺(jué)大概是0.5秒。在動(dòng)畫時(shí)間里,系統(tǒng)自動(dòng)判定哪些屬性更改了,自動(dòng)對(duì)更改的屬性進(jìn)行動(dòng)畫插值,生成中間幀然后連續(xù)顯示產(chǎn)生動(dòng)畫效果。

6.坐標(biāo)系系統(tǒng)(對(duì)position和anchorPoint的關(guān)系還是犯暈)
CALayer的坐標(biāo)系系統(tǒng)和UIView有點(diǎn)不一樣,它多了一個(gè)叫anchorPoint的屬性,它使用CGPoint結(jié)構(gòu),但是值域是0~1,也就是按照比例來(lái)設(shè)置。這個(gè)點(diǎn)是各種圖形變換的坐標(biāo)原點(diǎn),同時(shí)會(huì)更改layer的position的位置,它的缺省值是{0.5, 0.5},也就是在layer的中央。
某layer.anchorPoint = CGPointMake(0.f, 0.f);
如果這么設(shè)置,layer的左上角就會(huì)被挪到原來(lái)的中間的位置,
加上這樣一句就好了
某layer.position = CGPointMake(0.f, 0.f);

7.真實(shí)例子的分析

???
這是iphone上iBook翻頁(yè)的效果,假設(shè)每一頁(yè)都是一個(gè)UIView,我覺(jué)得一個(gè)頁(yè)面是貼了倆個(gè)Layer,文字Layer顯示正面的內(nèi)容,背面layer用文字layer的快照做affine翻轉(zhuǎn),貼在文字layer的后面。因?yàn)長(zhǎng)ayer可以設(shè)置顯示陰影,也許后面的陰影效果沒(méi)有使用單獨(dú)的一個(gè)layer來(lái)顯示。至于這個(gè)曲面效果,我查了很多資料也沒(méi)有結(jié)果,估計(jì)是使用了GL的曲面繪圖?

8.最后一個(gè)
layer可以設(shè)置圓角顯示,例如UIButton的效果,也可以設(shè)置陰影顯示,但是如果layer樹中的某個(gè)layer設(shè)置了圓角,樹中所有l(wèi)ayer的陰影效果都將顯示不了了。如果既想有圓角又想要陰影,好像只能做兩個(gè)重疊的UIView,一個(gè)的layer顯示圓角,一個(gè)的layer顯示陰影.....
?



?

haoxue2011-10-11 17:37
什么是CALayer??
CALayer(這里簡(jiǎn)單地稱其為層)。?
首先要說(shuō)的是CALayers 是屏幕上的一個(gè)具有可見內(nèi)容的矩形區(qū)域,每個(gè)UIView都有一個(gè)根CALayer,?
其所有的繪制(視覺(jué)效果)都是在這個(gè)layer上進(jìn)行的。?
UILabel*?lable?=?[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 30)];?
lable.text?=?@"test";?
[self.view addSubview:?lable];?
lable.backgroundColor?=?[UIColor clearColor];?
[lable release];?
// 設(shè)定CALayer?
self.view.layer.backgroundColor?=[UIColor orangeColor].CGColor;?
self.view.layer.cornerRadius?=20.0;?
self.view.layer.frame?=?CGRectInset(self.view.layer.frame, 20, 20);?
請(qǐng)注意,我創(chuàng)建的UILable始終隨著UIView的根CALayer的縮放而改變位置。)?
其次,CALayer的可以影響其外觀的特性有:?
  • 層的大小尺寸背景色內(nèi)容(比如圖像或是使用
  • Core Graphics
  • 繪制的內(nèi)容)是否使用圓角是否使用陰影等等
  • 需要說(shuō)明的是CALayer的大部分屬性都可以用來(lái)實(shí)現(xiàn)動(dòng)畫效果。?
    另外,你可以直接使用CALayer,也可以使用其子類,如CAGradientLayer,CATextLayer, CAShapeLayer等等。?
    示例?
    首先在Xcode中創(chuàng)建一個(gè)View-based App,CALayer是屬于QuartzCore framework的,所以需要引入QuartzCore framework,另外在程序中包括QuartzCore.h。?
    第一個(gè)例子是創(chuàng)建一個(gè)帶圓角的層,在你的ViewController中的ViewDidLoad中加入下面代碼:?
    // Import QuartzCore.h at the top of the file?
    #import <QuartzCore/QuartzCore.h>?

    // Uncomment viewDidLoad and add the following lines?
    self.view.layer.backgroundColor?=[UIColor orangeColor].CGColor;?
    self.view.layer.cornerRadius?=20.0;?
    self.view.layer.frame?=?CGRectInset(self.view.layer.frame, 20, 20);?


    然后添加一個(gè)帶陰影效果的子層,加入下列代碼:?
    CALayer?*sublayer?=?[CALayer layer];?
    sublayer.backgroundColor?=?[UIColor blueColor].CGColor;?
    sublayer.shadowOffset?=?CGSizeMake(0, 3);?
    sublayer.shadowRadius?=?5.0;?
    sublayer.shadowColor?=?[UIColor blackColor].CGColor;?
    sublayer.shadowOpacity?=?0.8;?
    sublayer.frame?=?CGRectMake(30, 30, 128, 192);?
    [self.view.layer addSublayer:sublayer];?



    為子層增加內(nèi)容(圖片),你還可以設(shè)置層的邊框,代碼如下:?
    sublayer.contents?=(id)[UIImage imageNamed:@"BattleMapSplashScreen.png"].CGImage;?
    sublayer.borderColor?=[UIColor blackColor].CGColor;?
    sublayer.borderWidth?=2.0;?


    如果你希望子層也是圓角怎么辦?你可能說(shuō)很容易設(shè)置cornerRadius屬性就行。實(shí)際上你即算是設(shè)置了cornerRadius屬性,圖片仍然不會(huì)顯示圓角。你還需要設(shè)置masksToBounds為YES。但是這樣做還是不夠的,因?yàn)槿绻沁@樣,這個(gè)層的陰影顯示就沒(méi)有了。簡(jiǎn)單的實(shí)現(xiàn)方法如下(通過(guò)兩個(gè)層來(lái)實(shí)現(xiàn)):?
    CALayer?*sublayer?=[CALayer layer];?
    sublayer.backgroundColor?=[UIColor blueColor].CGColor;?
    sublayer.shadowOffset?=?CGSizeMake(0, 3);?
    sublayer.shadowRadius?=5.0;?
    sublayer.shadowColor?=[UIColor blackColor].CGColor;?
    sublayer.shadowOpacity?=0.8;?
    sublayer.frame?=?CGRectMake(30, 30, 128, 192);?
    sublayer.borderColor?=[UIColor blackColor].CGColor;?
    sublayer.borderWidth?=2.0;?
    sublayer.cornerRadius?=10.0;?
    [self.view.layer addSublayer:sublayer];?

    CALayer?*imageLayer?=[CALayer layer];?
    imageLayer.frame?=?sublayer.bounds;?
    imageLayer.cornerRadius?=10.0;?
    imageLayer.contents?=(id)[UIImage imageNamed:@"BattleMapSplashScreen.png"].CGImage;?
    imageLayer.masksToBounds?=YES;?
    [sublayer addSublayer:imageLayer];?


    最后,還介紹一下自繪圖型的實(shí)現(xiàn),其要點(diǎn)是要設(shè)置所繪制層的delegate。比如在我們的例子中使用ViewController作為delegate,那么就需要在ViewController中實(shí)現(xiàn)drawLayer:inContext方法,對(duì)層進(jìn)行繪制工作。另外,還需要調(diào)用setNeedsDisplay,來(lái)通知層需要進(jìn)行繪制了,于是層才會(huì)通過(guò)對(duì)delegate的drawLayer:inContext方法進(jìn)行調(diào)用。?
    代碼如下:?
    void?MyDrawColoredPattern?(void*info, CGContextRef context){?
    ??
    ? ? CGColorRef dotColor?=[UIColor colorWithHue:0 saturation:0 brightness:0.07 alpha:1.0].CGColor;?
    ? ? CGColorRef shadowColor?=[UIColor colorWithRed:1 green:1 blue:1 alpha:0.1].CGColor;?
    ??
    ? ? CGContextSetFillColorWithColor(context, dotColor);?
    ? ? CGContextSetShadowWithColor(context, CGSizeMake(0, 1), 1, shadowColor);?
    ??
    ? ? CGContextAddArc(context, 3, 3, 4, 0, radians(360), 0);?
    ? ? CGContextFillPath(context);?
    ??
    ? ? CGContextAddArc(context, 16, 16, 4, 0, radians(360), 0);?
    ? ? CGContextFillPath(context);?
    ??
    }?

    -(void)drawLayer:(CALayer?*)layer inContext:(CGContextRef)context?{?
    ??
    ? ? CGColorRef bgColor?=[UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:1.0].CGColor;?
    ? ? CGContextSetFillColorWithColor(context, bgColor);?
    ? ? CGContextFillRect(context, layer.bounds);?
    ??
    ? ? staticc*****t CGPatternCallbacks callbacks?={0,?&MyDrawColoredPattern,?NULL};?
    ??
    ? ? CGContextSaveGState(context);?
    ? ? CGColorSpaceRef patternSpace?=?CGColorSpaceCreatePattern(NULL);?
    ? ? CGContextSetFillColorSpace(context, patternSpace);?

    還需要注意,radians是一個(gè)自定義函數(shù):?
    static?inline?double?radians?(double?degrees)?{?return?degrees?*?M_PI/180;?}?
    效果如下:?






    ?

    haoxue2011-10-11 18:55
    CALayer?這個(gè)類么,和UIView有什么區(qū)別和聯(lián)系?Layer到底是個(gè)什么東西?
    答:就是層啊,這個(gè)層你隨便控制他的大小,旋轉(zhuǎn),角度,坐標(biāo)變化或者內(nèi)容之類的信息,這些變化還可以通過(guò)動(dòng)畫表現(xiàn)出來(lái)。
    UIView所有你能看到的顯示的內(nèi)容,后面都有一個(gè)Layer。
    UIView 的animation我覺(jué)得是一種簡(jiǎn)化,實(shí)質(zhì)還是調(diào)用的CALayer

    Core Animation繪圖的基礎(chǔ)是“層”,叫做CALayer。你可以在View中設(shè)置層,層中可以放置更多的層。

    每個(gè)層都可以設(shè)定單獨(dú)的動(dòng)作,還可以給上一級(jí)的層設(shè)置動(dòng)作,下一級(jí)的層就可以跟著上一層進(jìn)行動(dòng)作。

    CALayer是為更好實(shí)現(xiàn)View的動(dòng)畫,比如你想View消失時(shí)做成玻璃破碎的效果,
    就可以在View的CALayer上密密麻麻排一層N個(gè)小的子CALayer,設(shè)置每個(gè)CALayer的落下動(dòng)畫,用View就比較不合適。

    一個(gè)UIView包含CALayer樹,CALayer是一個(gè)數(shù)據(jù)模型,包含了一些用于顯示的對(duì)象,但本身不用于顯示。






    ?

    haoxue2011-10-11 23:33
    UIView的基礎(chǔ)知識(shí)
    在iphone里你看到的,摸到的,都是UIView,所以UIView在iphone開發(fā)里具有非常重要的作用。?視圖和窗口展示了應(yīng)用的用戶界面,同時(shí)負(fù)責(zé)界面的交互。UIKit和其他系統(tǒng)框架提供了很多視圖,你可以就地使用而幾乎不需要修改。當(dāng)你需要展示的內(nèi)容與標(biāo)準(zhǔn)視圖允許的有很大的差別時(shí),你也可以定義自己的視圖。
    不管你是使用系統(tǒng)的視圖還是創(chuàng)建自己的視圖,你需要理解UIView和UIWindow類所提供的基本結(jié)構(gòu)。這些類提供了復(fù)雜的方法來(lái)管理視圖的布局和展示。理解這些方法的工作非常重要,使你在應(yīng)用發(fā)生改變時(shí)可以確認(rèn)視圖有合適的行為。
    ?視圖架構(gòu)?
    大部分你想要可視化操作都是由視圖對(duì)象-即UIView類的實(shí)例-來(lái)進(jìn)行的。一個(gè)視圖對(duì)象定義了一個(gè)屏幕上的一個(gè)矩形區(qū)域,同時(shí)處理該區(qū)域的繪制和觸屏事件。一個(gè)視圖也可以作為其他視圖的父視圖,同時(shí)決定著這些子視圖的位置和大小。UIView類做了大量的工作去管理這些內(nèi)部視圖的關(guān)系,但是需要的時(shí)候你也可以定制默認(rèn)的行為。
    視圖與層聯(lián)合起來(lái)處理著視圖內(nèi)容的解釋和動(dòng)畫過(guò)渡。每個(gè)UIKit框架里的視圖都被一個(gè)層對(duì)象支持(通常是一個(gè)CALayer類的實(shí)例),它管理管理著后臺(tái)的視圖存儲(chǔ)和處理視圖相關(guān)的動(dòng)畫。然而,當(dāng)你需要對(duì)視圖的解釋和動(dòng)畫行為有更多的控制權(quán)時(shí),你可以使用層。
    為了理解視圖和層之間的關(guān)系,我們可以借助于一些例子。應(yīng)用中的視圖包括了一個(gè)window(同時(shí)也是一個(gè)視圖),一個(gè)通用的表現(xiàn)得像一個(gè)容器視圖的UIView對(duì)象,一個(gè)圖像視圖,一個(gè)控制顯示用的工具條,和一個(gè)工具條按鈕(它本身不是一個(gè)視圖但是在內(nèi)部管理著一個(gè)視圖)。(注意這個(gè)應(yīng)用包含了一個(gè)額外的圖像視圖,它是用來(lái)實(shí)現(xiàn)動(dòng)畫的)。為了簡(jiǎn)化,同時(shí)因?yàn)檫@個(gè)視圖通常是被隱藏的,所以沒(méi)把它包含在下面的圖中。每個(gè)視圖都有一個(gè)相應(yīng)的層對(duì)象,它可以通過(guò)視圖礶r屬性被訪問(wèn)。(因?yàn)楣ぞ邨l按鈕不是一個(gè)視圖,你不能直接訪問(wèn)它的層對(duì)象。)

    ?

    xiaobaobao2011-10-12 00:48
    這個(gè)好東西,mark!!!

    ?

    haoxue2011-10-12 01:19
    CALayer和UIView的關(guān)系?
    一個(gè)UIView包含CALayer樹,CALayer是一個(gè)數(shù)據(jù)模型,包含了一些用于顯示的對(duì)象,但本身不用于顯示。?
    CALayer相當(dāng)于photoshop的一個(gè)層,很多動(dòng)畫可以通過(guò)設(shè)置CALayer來(lái)實(shí)現(xiàn)。據(jù)說(shuō)有人用CALayer顯示圖片來(lái)播放視頻。
    Core animation應(yīng)該是用CAlayer來(lái)實(shí)現(xiàn)各種動(dòng)畫。

    ?

    snowren2011-10-12 10:01
    ????

    ?

    haoxue2011-10-15 01:52
    CALayer簡(jiǎn)單教程

    首先要說(shuō)的是CALayers 是屏幕上的一個(gè)具有可見內(nèi)容的矩形區(qū)域,每個(gè)UIView都有一個(gè)根CALayer,其所有的繪制(視覺(jué)效果)都是在這個(gè)layer上進(jìn)行的。(譯者注:為驗(yàn)證這點(diǎn),我寫下了如下代碼:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ?
    UILabel*?lable?=?[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 30)];
    lable.text?=?@"test";
    [self.view addSubview:?lable];
    lable.backgroundColor?=?[UIColor clearColor];
    [lable release];

    // 設(shè)定CALayer
    self.view.layer.backgroundColor?=[UIColor orangeColor].CGColor;
    self.view.layer.cornerRadius?=20.0;
    self.view.layer.frame?=?CGRectInset(self.view.layer.frame, 20, 20);
    請(qǐng)注意,我創(chuàng)建的UILable始終隨著UIView的根CALayer的縮放而改變位置。)
    其次,CALayer的可以影響其外觀的特性有:層的大小尺寸背景色內(nèi)容(比如圖像或是使用Core Graphics繪制的內(nèi)容)是否使用圓角是否使用陰影等等
    需要說(shuō)明的是CALayer的大部分屬性都可以用來(lái)實(shí)現(xiàn)動(dòng)畫效果。
    另外,你可以直接使用CALayer,也可以使用其子類,如CAGradientLayer,CATextLayer, CAShapeLayer等等。
    示例
    首先在Xcode中創(chuàng)建一個(gè)View-based App,CALayer是屬于QuartzCore framework的,所以需要引入QuartzCore framework,另外在程序中包括QuartzCore.h。
    第一個(gè)例子是創(chuàng)建一個(gè)帶圓角的層,在你的ViewController中的ViewDidLoad中加入下面代碼:

    1
    2
    3
    4
    5
    6
    7
    ?
    // Import QuartzCore.h at the top of the file
    #import <QuartzCore/QuartzCore.h>

    // Uncomment viewDidLoad and add the following lines
    self.view.layer.backgroundColor?=[UIColor orangeColor].CGColor;
    self.view.layer.cornerRadius?=20.0;
    self.view.layer.frame?=?CGRectInset(self.view.layer.frame, 20, 20);
    結(jié)果如下:
    然后添加一個(gè)帶陰影效果的子層,加入下列代碼:



    1
    2
    3
    4
    5
    6
    7
    8
    ?
    CALayer?*sublayer?=?[CALayer layer];
    sublayer.backgroundColor?=?[UIColor blueColor].CGColor;
    sublayer.shadowOffset?=?CGSizeMake(0, 3);
    sublayer.shadowRadius?=?5.0;
    sublayer.shadowColor?=?[UIColor blackColor].CGColor;
    sublayer.shadowOpacity?=?0.8;
    sublayer.frame?=?CGRectMake(30, 30, 128, 192);
    [self.view.layer addSublayer:sublayer];
    效果圖:
    為子層增加內(nèi)容(圖片),你還可以設(shè)置層的邊框,代碼如下:

    1
    2
    3
    ?
    sublayer.contents?=(id)[UIImage imageNamed:@"BattleMapSplashScreen.png"].CGImage;
    sublayer.borderColor?=[UIColor blackColor].CGColor;
    sublayer.borderWidth?=2.0;
    效果圖:
    ?

    如果你希望子層也是圓角怎么辦?你可能說(shuō)很容易設(shè)置cornerRadius屬性就行。實(shí)際上你即算是設(shè)置了cornerRadius屬性,圖片仍然不會(huì)顯示圓角。你還需要設(shè)置masksToBounds為YES。但是這樣做還是不夠的,因?yàn)槿绻沁@樣,這個(gè)層的陰影顯示就沒(méi)有了。簡(jiǎn)單的實(shí)現(xiàn)方法如下(通過(guò)兩個(gè)層來(lái)實(shí)現(xiàn)):
    CALayer?*sublayer?=[CALayer layer];
    sublayer.backgroundColor?=[UIColor blueColor].CGColor;
    sublayer.shadowOffset?=?CGSizeMake(0, 3);
    sublayer.shadowRadius?=5.0;
    sublayer.shadowColor?=[UIColor blackColor].CGColor;
    sublayer.shadowOpacity?=0.8;
    sublayer.frame?=?CGRectMake(30, 30, 128, 192);
    sublayer.borderColor?=[UIColor blackColor].CGColor;
    sublayer.borderWidth?=2.0;
    sublayer.cornerRadius?=10.0;
    [self.view.layer addSublayer:sublayer];

    CALayer?*imageLayer?=[CALayer layer];
    imageLayer.frame?=?sublayer.bounds;
    imageLayer.cornerRadius?=10.0;
    imageLayer.contents?=(id)[UIImage imageNamed:@"BattleMapSplashScreen.png"].CGImage;
    imageLayer.masksToBounds?=YES;
    [sublayer addSublayer:imageLayer];
    效果圖:
    ?
    最后,還介紹一下自繪圖型的實(shí)現(xiàn),其要點(diǎn)是要設(shè)置所繪制層的delegate。比如在我們的例子中使用ViewController作為delegate,那么就需要在ViewController中實(shí)現(xiàn)drawLayer:inContext方法,對(duì)層進(jìn)行繪制工作。另外,還需要調(diào)用setNeedsDisplay,來(lái)通知層需要進(jìn)行繪制了,于是層才會(huì)通過(guò)對(duì)delegate的drawLayer:inContext方法進(jìn)行調(diào)用。
    代碼如下:

    void?MyDrawColoredPattern?(void*info, CGContextRef context){
    ?
    ? ? CGColorRef dotColor?=[UIColor colorWithHue:0 saturation:0 brightness:0.07 alpha:1.0].CGColor;
    ? ? CGColorRef shadowColor?=[UIColor colorWithRed:1 green:1 blue:1 alpha:0.1].CGColor;
    ?
    ? ? CGContextSetFillColorWithColor(context, dotColor);
    ? ? CGContextSetShadowWithColor(context, CGSizeMake(0, 1), 1, shadowColor);
    ?
    ? ? CGContextAddArc(context, 3, 3, 4, 0, radians(360), 0);
    ? ? CGContextFillPath(context);
    ?
    ? ? CGContextAddArc(context, 16, 16, 4, 0, radians(360), 0);
    ? ? CGContextFillPath(context);
    ?
    }

    -(void)drawLayer:(CALayer?*)layer inContext:(CGContextRef)context?{
    ?
    ? ? CGColorRef bgColor?=[UIColor colorWithHue:0.6 saturation:1.0 brightness:1.0 alpha:1.0].CGColor;
    ? ? CGContextSetFillColorWithColor(context, bgColor);
    ? ? CGContextFillRect(context, layer.bounds);
    ?
    ? ? staticc*****t CGPatternCallbacks callbacks?={0,?&MyDrawColoredPattern,?NULL};
    ?
    ? ? CGContextSaveGState(context);
    ? ? CGColorSpaceRef patternSpace?=?CGColorSpaceCreatePattern(NULL);
    ? ? CGContextSetFillColorSpace(context, patternSpace);
    ? ? CGColorSpaceRelease(patternSpace);
    ?
    ? ? CGPatternRef pattern?=?CGPatternCreate(NULL,
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?layer.bounds,
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CGAffineTransformIdentity,
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?24,
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?24,
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?kCGPatternTilingC*****tantSpacing,
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?true,
    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&callbacks);
    ? ? CGFloat alpha?=1.0;
    ? ? CGContextSetFillPattern(context, pattern,?&alpha);
    ? ? CGPatternRelease(pattern);
    ? ? CGContextFillRect(context, layer.bounds);
    ? ? CGContextRestoreGState(context);
    }
    ?
    還需要注意,radians是一個(gè)自定義函數(shù):



    1
    ?
    static?inline?double?radians?(double?degrees)?{?return?degrees?*?M_PI/180;?}
    效果如下:



    ?

    u3dtest2011-10-18 15:46
    學(xué)習(xí)了,受教受教啊

    ?

    leonqgl2011-10-19 12:06
    原來(lái)是經(jīng)驗(yàn)匯總貼,有價(jià)值

    ?

    haoxue2011-10-20 00:36
    作為程序員,要特別注意:要積極參加體育鍛煉,預(yù)防糖尿病和頸椎病!(特別重要)

    ?

    haoxue2011-10-23 11:41
    自定義UIViewController與xib文件關(guān)系深入分析

    用xcode模板向工程加入U(xiǎn)IViewController sub class的時(shí)候,如果選中了with xib for interface,那么就會(huì)向工作加入三個(gè)文件(.h .m .xib), 這樣生成的三個(gè)文件除后綴名后都是一樣的名字。

    現(xiàn)在如果我們需要用這個(gè)剛加入的自定義UIVewController,可以如下方式定義:
    CustomViewController* customViewController = [[CustomViewController alloc] initWithNibName:nil bundle:nil];?
    你可以看現(xiàn)第一個(gè)傳數(shù)是nil, 對(duì)沒(méi)錯(cuò),傳nil也是可以的。因?yàn)槿绻到y(tǒng)發(fā)現(xiàn)是nil的話,會(huì)在工程的bundle里找與CustomViewController同名的xib文件,因?yàn)槟0嫔傻恼妹窒嗤?#xff0c;所以能夠正確加載xib文件。
    第二種方法:
    CustomViewController* customViewController = [[CustomViewController alloc] init];?
    在這兒我們只是簡(jiǎn)單的初始化,也能正解加載相應(yīng)的xib文件,因?yàn)樗麄兠质窍嗤摹?br />如果xib的名了與類的名字不同呢?
    如果不同那么我們就不能用上面的兩種方法,必須顯示指明xib的名字,如:
    CustomViewController* customViewController = [[CustomViewController alloc] initWithNibName:"firstView" bundle:nil]

    在這兒我們顯示指明是firstView.xib這個(gè)文件。
    網(wǎng)上有人說(shuō),自定義UITableViewController與自定義UIViewController不一樣,即使.h .m .xib文件名一樣(除后綴名),也必須顯示指明xib的名字。 參看:http://www.outofcore.com/2011/07/ios-development-proper-use-of-initwithnibnamebundle-affects-uitableviewcontroller/
    我在xcode4 SDK 4.3上測(cè)試了,結(jié)果是一樣的,也可以不用指明, 我的測(cè)試是直接將自定義的controller賦值給windows.rootViewController,如:
    testTableView *tableView = [[[testTableView alloc] initWithNibName:nil bundle:nil] autorelease];?
    self.window.rootViewController = tableView;

    不知道是否我測(cè)試不夠準(zhǔn)確,大家可以親自測(cè)試一下:)

    ?

    無(wú)出吾右2011-10-23 23:38
    東西很不錯(cuò),樓主是個(gè)認(rèn)真的人,mark

    ?

    zhenhi2011-10-24 09:52
    樓主的帖子往往是精品

    ?

    tidynine2011-10-24 10:19
    mark,收藏,謝謝

    ?

    ljlwz19862011-10-24 14:49
    不說(shuō)啥了,必須mark啊。。

    ?

    cao_ya_dong2011-10-25 13:48
    ??????咋現(xiàn)在才發(fā)現(xiàn)這么好的資料啊。

    ?

    haoxue2011-10-27 00:07
    iphone 程序view的流程

    由init、loadView、viewDidLoad、viewDidUnload、dealloc的關(guān)系說(shuō)起
     init方法
      在init方法中實(shí)例化必要的對(duì)象(遵從LazyLoad思想)
    ?  init方法中初始化ViewController本身
     loadView方法
      當(dāng)view需要被展示而它卻是nil時(shí),viewController會(huì)調(diào)用該方法。不要直接調(diào)用該方法。
      如果手工維護(hù)views,必須重載重寫該方法
      如果使用IB維護(hù)views,必須不能重載重寫該方法
     loadView和IB構(gòu)建view
      你在控制器中實(shí)現(xiàn)了loadView方法,那么你可能會(huì)在應(yīng)用運(yùn)行的某個(gè)時(shí)候被內(nèi)存管理控制調(diào)用。 如果設(shè)備內(nèi)存不足的時(shí)候, view 控制器會(huì)收到didReceiveMemoryWarning的消息。 默認(rèn)的實(shí)現(xiàn)是檢查當(dāng)前控制器的view是否在使用。 如果它的view不在當(dāng)前正在使用的view hierarchy里面,且你的控制器實(shí)現(xiàn)了loadView方法,那么這個(gè)view將被release, loadView方法將被再次調(diào)用來(lái)創(chuàng)建一個(gè)新的view。
     viewDidLoad方法
      viewDidLoad?此方法只有當(dāng)view從nib文件初始化的時(shí)候才被調(diào)用。
      重載重寫該方法以進(jìn)一步定制view
      在iPhone OS 3.0及之后的版本中,還應(yīng)該重載重寫viewDidUnload來(lái)釋放對(duì)view的任何索引
      viewDidLoad后調(diào)用數(shù)據(jù)Model
    ?
     viewDidUnload方法?
      當(dāng)系統(tǒng)內(nèi)存吃緊的時(shí)候會(huì)調(diào)用該方法(注:viewController沒(méi)有被dealloc)
      內(nèi)存吃緊時(shí),在iPhone OS 3.0之前didReceiveMemoryWarning是釋放無(wú)用內(nèi)存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式
      在該方法中將所有IBOutlet(無(wú)論是property還是實(shí)例變量)置為nil(系統(tǒng)release view時(shí)已經(jīng)將其release掉了)
      在該方法中釋放其他與view有關(guān)的對(duì)象、其他在運(yùn)行時(shí)創(chuàng)建(但非系統(tǒng)必須)的對(duì)象、在viewDidLoad中被創(chuàng)建的對(duì)象、緩存數(shù)據(jù)等  release對(duì)象后,將對(duì)象置為nil(IBOutlet只需要將其置為nil,系統(tǒng)release view時(shí)已經(jīng)將其release掉了)
      一般認(rèn)為viewDidUnload是viewDidLoad的鏡像,因?yàn)楫?dāng)view被重新請(qǐng)求時(shí),viewDidLoad還會(huì)重新被執(zhí)行
      viewDidUnload中被release的對(duì)象必須是很容易被重新創(chuàng)建的對(duì)象(比如在viewDidLoad或其他方法中創(chuàng)建的對(duì)象),不要release用戶數(shù)據(jù)或其他很難被重新創(chuàng)建的對(duì)象
     dealloc方法
      viewDidUnload和dealloc方法沒(méi)有關(guān)聯(lián),dealloc還是繼續(xù)做它該做的事情。
    文章二:
      viewDidUnload
    該方法在收到內(nèi)存警告,同時(shí)該視圖并不在當(dāng)前界面顯示時(shí)候會(huì)被調(diào)用,此時(shí)該 controller 的 view 已經(jīng)被釋放并賦值為 nil。
    接下來(lái)你要做的是
    把實(shí)例變量的子視圖釋放(IBOulet 的,以及自己添加的)
    其他實(shí)例變量,比如之前在 -viewDidLoaded 中實(shí)例的數(shù)據(jù)數(shù)組、http 請(qǐng)求釋放掉
    ??? 因?yàn)楫?dāng)該 viewController 再次被激活準(zhǔn)備顯示時(shí)(比如 navigationControler 返回到上一級(jí)),vc 發(fā)現(xiàn)自己的 view 為空后會(huì)重復(fù)之前的流程直到把 view 給創(chuàng)建起來(lái)。若沒(méi)將自己額外添加的子視圖,各種類實(shí)例變量釋放,這里便會(huì)重新再次創(chuàng)建

    ?

    ?

    romboo2011-10-28 20:33
    好東西,標(biāo)記

    ?

    haoxue2011-11-01 00:09
    窗口(UIWindow)
    視圖(UIView)是應(yīng)用和用戶的視覺(jué)交互的主要場(chǎng)所,它也承擔(dān)了接收手勢(shì)并且做出響應(yīng)的任務(wù)。
    窗口(UIWindow)和網(wǎng)頁(yè)視圖(UIWebView)
    窗口是視圖的一個(gè)子類窗口的主要功能:一是提供一個(gè)區(qū)域來(lái)顯示視圖,二是將事件(event)分發(fā)給視圖(請(qǐng)參考本節(jié)的小知識(shí)來(lái)了解iOS中的事件分發(fā)機(jī)制)。一個(gè)應(yīng)用通常只有一個(gè)窗口,但也有例外,比如在一個(gè)iPhone應(yīng)用中加載一個(gè)電影播放器,這個(gè)應(yīng)用本身有一個(gè)窗口,而電影播放器還有另一個(gè)窗口。
    小知識(shí):iOS中的事件類型和分發(fā)
    iOS設(shè)備上有很多硬件能夠因用戶的行為而產(chǎn)生數(shù)據(jù),包括觸摸屏、加速度傳感器和陀螺儀。當(dāng)原始數(shù)據(jù)產(chǎn)生后,系統(tǒng)的一些框架會(huì)對(duì)這些原始數(shù)據(jù)進(jìn)行封裝,并作為事件傳遞給正在運(yùn)行的應(yīng)用來(lái)進(jìn)行處理。
    當(dāng)應(yīng)用收到一個(gè)事件后,會(huì)先將其放在事件隊(duì)列(event queue)當(dāng)中。應(yīng)用的singleton從事件隊(duì)列中取出一個(gè)事件并分發(fā)給關(guān)鍵窗口(key window)來(lái)處理。
    如果這個(gè)事件是一個(gè)觸摸事件的話,那么窗口會(huì)將事件按照視圖層次傳遞到最上層(用戶可見)的視圖對(duì)象,這個(gè)傳遞順序叫做響應(yīng)鏈(responder chain)向下順序。響應(yīng)鏈最下層(也是視圖最上層)的視圖對(duì)象如果不能處理這個(gè)事件,那么響應(yīng)鏈的上一級(jí)的視圖將得到這個(gè)事件并嘗試處理這個(gè)事件,如果不能處理的話就繼續(xù)向上傳遞,直到找到能處理該事件的對(duì)象為止。
    如果這個(gè)事件不是一個(gè)觸摸事件,那么事件的分發(fā)機(jī)制有所不同,在此不做介紹。

    ?

    carya2011-11-01 09:12
    好東西,mark,學(xué)習(xí)了

    ?

    haoxue2011-11-02 10:41
    Cocoa的MVC架構(gòu)分析

    在Cocoa框架中:
    所有的控件、窗口等都繼承自 UIView,對(duì)應(yīng)MVC中的 V。UIView及其子類主要負(fù)責(zé)UI的實(shí)現(xiàn),而UIView所產(chǎn)生的事件都可以采用委托的方式,交給UIViewController實(shí)現(xiàn)。對(duì)于不同的UIView,都有相應(yīng)的UIViewController 對(duì)應(yīng)MVC中的C。比如在iPhone OS上常用的UITableView,它所對(duì)應(yīng)的Controller就是UITableViewController。至于MVC中的M,那需要根據(jù)用戶自己的需求來(lái)實(shí)現(xiàn)了。

    下面看一下一個(gè)自定義UIView的架構(gòu)是怎么樣的。這之前要認(rèn)識(shí)一下Objective-C中的幾個(gè)重要的關(guān)鍵字。
    @interface 定義一個(gè)類,這個(gè)很容易和Java中的interface混淆。
    @protocol 定義一個(gè)協(xié)議,我跟喜歡把它理解成一個(gè)接口,相當(dāng)于Java中的interface。
    Objective-C只支持單繼承,但可以實(shí)現(xiàn)多個(gè)協(xié)議(接口),語(yǔ)法如下:

    @interface Child : Parent <Protocol1,Protocol2> { //成員變量定義 } //成員方法,類方法,屬性定義 @end??
    有了以上的知識(shí)后,我們就可以來(lái)定義自己的UIView了。
    首先是定義一個(gè)UIView的子類。

    @interface MyUIView : UIView { //定義一些控件 id<MyUIViewDelegate> delegate; //這個(gè)定義會(huì)在后面的解釋,它是一個(gè)協(xié)議,用來(lái)實(shí)現(xiàn)委托。 } //定義一些控件設(shè)置方法 @property id<MyUIViewDelegate> delegate; //定義一個(gè)屬性,可以用來(lái)進(jìn)行g(shù)et set操作 @end??
    然后定義一個(gè)Protocol,按照Cocoa的習(xí)慣,一般它以delegate結(jié)尾,熟悉C#的同學(xué)應(yīng)該知道它的意義。其實(shí)不論是接口,委托,還是回調(diào)函數(shù),本質(zhì)上都做了一件事情。就是定義了一個(gè)操作契約,然后由用戶自己來(lái)實(shí)現(xiàn)它的具體內(nèi)容。

    @protocol MyUIViewDelegate //這里只需要聲明方法 - (void)func1 - (int)func2:(int)arg @end?

    完成以上兩步之后就需要設(shè)計(jì)自己的UIViewController了。一般簡(jiǎn)單的做法,可以讓這個(gè)Controller來(lái)實(shí)現(xiàn)上面定義的MyUIViewDelegate。在Cocoa框架中,很多控件和它的Controller都是采用的這種方式。

    @interface MyUIViewController : UIViewController <MyUIViewDelegate> { //成員變量 } //成員方法,類方法,屬性 @end?

    定義都完成了,到這里其實(shí)還看不出這三者是怎么聯(lián)系起來(lái)的。那接下來(lái)就要看看,MyUIView和MyUIViewController的具體實(shí)現(xiàn)了。

    首先是MyUIView的實(shí)現(xiàn)代碼,假設(shè)在MyUIView在發(fā)生某個(gè)事件后會(huì)調(diào)用doSometing方法。

    - (void)doSomething { if( delegate != nil ) //這里的delegate就是UIView定義時(shí)候的一個(gè)委托對(duì)象 { [delegate func1]; //[]表示對(duì)一個(gè)對(duì)象發(fā)消息,如果在Java中會(huì)寫成delegate.func1() } }?

    上面的代碼中 nil 相當(dāng)于 Java中的 null,這里的意思就很明顯了,如果delegate委托對(duì)象不為空,則調(diào)用相應(yīng)的方法,但是這個(gè)委托對(duì)象的方法在哪里實(shí)現(xiàn)呢。可以看一下MyUIViewController的定義,它實(shí)現(xiàn)了MyUIViewDelegate。所以這個(gè)方法當(dāng)然是由它來(lái)實(shí)現(xiàn)。代碼如下

    - (id)init { MyUIView *myView = [[MyUIView alloc] init]; //對(duì)MyUIView進(jìn)行初始化 myView.delegate = self; //將MyUIViewController自己的實(shí)例作為委托對(duì)象 self.view = myView; } - (void)func1 { //具體實(shí)現(xiàn),可以加入Model相關(guān)的代碼 }?

    這么一來(lái)整個(gè),整個(gè)代碼的線路就明白了。
    1.MyUIViewController初始化
    2.MyUIViewController初始化時(shí)初始化MyUIView,并且將自己作為委托對(duì)象賦值給MyUIView
    3.MyUIView發(fā)生事件,調(diào)用(回調(diào))委托對(duì)象的方法,其實(shí)就是調(diào)用MyUIViewController的方法。

    ?

    haoxue2011-11-12 11:24
    CALayer就是層,這個(gè)層你隨便控制他的大小,旋轉(zhuǎn),角度,坐標(biāo)變化或者內(nèi)容之類的信息,這些變化還可以通過(guò)動(dòng)畫表現(xiàn)出來(lái)。UIView所有你能看到的顯示的內(nèi)容,后面都有一個(gè)Layer。下面來(lái)自定義添加一個(gè)CALayer。
    CALayer *layer = [[CALayer alloc]init];//定義一個(gè)layer
    ?
    CGRect aa = CGRectMake(10, 30, 240,240);//設(shè)置該layer的坐標(biāo)和大小
    ?
    layer.frame = aa;
    ?
    UIColor *c = [UIColor redColor];
    ?
    [layersetBackgroundColor:(c.CGColor)];//設(shè)置該layer的背景,因?yàn)閘ayersetBackgroundColor用到的是CGColor所以要進(jìn)行一次轉(zhuǎn)換
    ?
    [self.view.layer insertSublayer:layeratIndex:0];//在self view中添加該layer

    ?

    haoxue2011-11-12 11:25
    在使用Xcode編寫程序的時(shí)候,在類方法上面option +雙擊就可以跳到Document中的相關(guān)說(shuō)明下面,很方便!

    ?

    haoxue2011-11-12 13:09
    模型 視圖 控制器(MVC)

    MVC模式將應(yīng)用程序中的對(duì)象設(shè)定為三種角色:模型角色(Model)、視圖角色(View)和控制器角色(Controller)。
    模型對(duì)象(Model)表示數(shù)據(jù)。例如,在iPhone自帶的通訊錄應(yīng)用中,聯(lián)系人是模型對(duì)象,在一個(gè)繪畫應(yīng)用中,圓形、矩形是模型對(duì)象。
    視圖對(duì)象(View)負(fù)責(zé)顯示數(shù)據(jù),比如UILabel可以顯示文本、UIImageView可以顯示圖片,也會(huì)支持用戶對(duì)數(shù)據(jù)的編輯操作,例如UITextField可以支持用戶輸入。
    控制器對(duì)象(Controller)介于模型和視圖之間。
    在我們接下來(lái)要?jiǎng)?chuàng)建的項(xiàng)目中,當(dāng)用戶點(diǎn)擊按鈕后,觸發(fā)更新操作,控制器對(duì)象將會(huì)從文本輸入框中獲取輸入的文字內(nèi)容,并把文字存放在一個(gè)字符串中,然后再把文本顯示框的內(nèi)容更新成格式化好的內(nèi)容。

    ?

    jinchishuxue2011-11-12 13:38
    樓主牛逼,頂。

    ?

    winsdom2011-11-12 13:41
    lz高人哪,插個(gè)樓

    ?

    wl1033012011-11-12 15:25
    mark??謝謝樓主,講得太好了

    ?

    y5002011-11-12 17:50
    mark...........

    ?

    雨綿綿2011-11-12 23:43
    多謝多謝啊

    ?

    haoxue2011-11-13 19:59
    異步調(diào)用
    異步調(diào)用就是你 喊 你朋友吃飯,你朋友說(shuō)知道了,待會(huì)忙完去找你 ,你就去做別的了。?

    同步調(diào)用就是你 喊 你朋友吃飯,你朋友在忙,你就一直在那等,等你朋友忙玩了,你們一起去。

    ?

    haoxue2011-11-14 15:01
    iphone開發(fā)View-Based Application基本名詞
    View:?
    這個(gè)名詞相信大多數(shù)的朋友都知道了,你可以在 View 上面畫畫,可以在上頭放一些控件,甚至可以把一個(gè) View 放到另外一個(gè) View 裏面,所有的 View 都來(lái)自於 UIView 這個(gè)類,而 UIView 又來(lái)自於 UIResponder,如果你看一下 Apple 的文檔,大概就可以知道 UIResponder 主要工作在於處理事件的. View 的外框我們稱為 frame,我們透過(guò)這個(gè) frame 來(lái)定義 View 的大小位置(例如:[view setFrame:frame]),至于要把一個(gè) View 加到另一個(gè) View 則可以用 [view addSubView:subView]?

    Controller:?
    在 XCode 產(chǎn)生代碼你會(huì)發(fā)現(xiàn)有一個(gè)繼承自 UIViewController 的類.甚至打開 MainWindow.xib 也可以看到它的蹤影. 也許有同學(xué)會(huì)以為這個(gè)和 MVC 裏面的 "C" 是同一個(gè)東東,其實(shí) UIViewController 只是幫你控制 View 的 Layout,例如當(dāng)你旋轉(zhuǎn) iPhone 時(shí),Controller 要幫你處理 View 的位置,另外像 View 與其他控件如 Toolbar 間的位置控制也是他的傑作. 當(dāng)然Controller 並不是必要的,你也是可以用 View 就來(lái)完成同樣的事.?

    Delegate:?

    Delegate 這個(gè)名詞相信大家都常看到吧,這東西有點(diǎn)像是現(xiàn)代孝順兒子的父母一樣,父母親擔(dān)任 Delegate(代理)幫兒子寫家庭作業(yè). 所有與用戶的互動(dòng)都會(huì)交給 Delegate 來(lái)處理,這樣子好處是可以把畫面與事件的處理分開,通常我們是以 Controller 來(lái)?yè)?dān)任 Delegate 的角色.?
    好了,看到這邊是不是有點(diǎn)了解又不太了解呢? 是的,我們只解釋了這些名詞,但是一個(gè) iPhone 的程式是怎麼開始動(dòng)起來(lái)的,這時(shí)候建議大家先產(chǎn)生一個(gè)應(yīng)用程式看看,並且打開 MainWindow.xib 找到 File's Owner 後看看他的 Delegate 是什麼? 我們尋著線索找下去應(yīng)該是 XXXAppDelegate,打開後大致上可以看到以下代碼片段:?


    - (void)applicationDidFinishLaunching:(UIApplication *)application {?
    [window addSubview:viewController.view];?
    [window makeKeyAndVisible];?
    }?


    - (void)dealloc {?
    [viewController release];?
    [window release];?
    [super dealloc];?
    }?
    首先映入眼簾的是 UIApplication 這個(gè)類,我們都知道 iPhone 要求同時(shí)間只能有一個(gè) Application 執(zhí)行,因此每個(gè)應(yīng)用程式都會(huì)對(duì)應(yīng)到一個(gè) UIApplication,我們可以用 [UIApplication sharedInstance] 來(lái)取得所對(duì)應(yīng)的應(yīng)用程式實(shí)例(instance),當(dāng)你執(zhí)行你的應(yīng)用程式後applicationDidFinishLaunching 就會(huì)被呼叫到(記得我們上面談到 Delegate 這個(gè)可憐的父母吧,事件傳給了他,由 Delegate 來(lái)處理事件)接著我們把 view 加到 window(其實(shí)他也是個(gè) view),然後讓這個(gè) window 變成可見的. 好了,如果你有興趣,最好能夠把 MainWindow.xib 內(nèi)的每一個(gè)圖標(biāo)打開來(lái)看看(File's Owner,First Responder,XXXController...),然後追蹤一下他們的 delegate,相信你能了解的更多.?


    ?

    haoxue2011-11-14 15:54
    iPhone開發(fā)如何從nib文件中載入自定義的UIView呢?


  • @interface MyView : UIView
  • @property (nonatomic, retain) IBOutlet MyImage *image;
  • @end
  • ?
  • @implementation MyView
  • @synthesize image;
  • ?
  • - (id)init
  • {
  • ? ?self = [super initWithNibName:@"MyView" bundle:nibBundleOrNil];
  • ? ?return self;
  • }
  • @end
  • @interface MyImage : UIImageView
  • @end
  • ?
  • @implementation MyImage
  • - (id)init
  • {
  • ? ?// This doesn't get called?
  • ? ?self = [super init];
  • ? ?if (self)?
  • ? ?{
  • ? ?? ?// do somethin
  • ? ?}
  • ? ?return self;
  • }
  • @end


  • ?

    舍得3332011-11-21 00:49
    樓主實(shí)在是太好了??支持

    ?

    liliangwor2011-11-21 09:32
    不知道調(diào)用CGLayer能否調(diào)用GPU。

    ?

    1ovekof2011-11-21 10:14
    感謝樓主,你前還真沒(méi)關(guān)注過(guò)CALayer。

    ?

    hpfdm2011-11-21 15:01
    這么好的帖子,我應(yīng)該頂,感覺(jué)中文的論壇有樓主這樣的人,以后有希望了!!!

    ?

    sd41378382011-11-21 18:58
    多謝樓主分享

    ?

    goodluckfrank2011-11-21 20:40
    好貼,mark

    ?

    scp3068061062011-11-22 11:01
    又見技術(shù)流!
    收藏了好多技術(shù)貼,都還沒(méi)消化呢。

    ?

    qq5689970302011-11-22 14:27
    謝謝樓主了

    ?

    cg1011002011-11-22 15:07
    認(rèn)真學(xué)習(xí)一下!!!!

    ?

    haoxue2011-11-28 09:49
    核心動(dòng)畫編程指南【中文完整翻譯版】


    ?核心動(dòng)畫編程指南
    原文:Core Animation Programming Guide
    鏈接:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Introduction/Introduction.html


    譯者感言:
    之前一直在CocoaChina上面潛水,雖然做iOS開發(fā)也快2年了,但是總覺(jué)得缺少了點(diǎn)什么。以前查看英文API文檔,有些細(xì)節(jié)總是記不住,每次看完之后也沒(méi)什么印象。忽然有一天有人向我抱怨說(shuō)查看官方英文API文檔太痛苦了,然后我就想如果我把一些常用的官方文檔翻譯為中文的話,或許可以幫助這批需要幫助的人,然后偶就心血來(lái)潮,開始了自?shī)首詷?lè)的翻譯過(guò)程。這是第一篇翻譯的文檔,耗時(shí)兩個(gè)禮拜的晚上。。。
    本文在翻譯過(guò)程中發(fā)現(xiàn)很多地方直譯成中文比較晦澀,所以采用了意譯的方式,這不可避免的造成有一些地方可能和原文有一定的出入,所以如果你閱讀的時(shí)候發(fā)現(xiàn)有任何的錯(cuò)誤都可以給我發(fā)郵件:xyl.layne@gmail.com
    最后希望這篇文檔能幫上那些感覺(jué)看官方英文文檔困難的人。如果可以我推薦盡量查看英文原文檔,畢竟那是原汁原味,翻譯總無(wú)法避免有一定的疏漏。


    [url=read.php?tid=84461]http://www.cocoachina.com/bbs/read.php?tid=84461[/url]

    ?

    volcan19872011-11-28 13:37
    好貼,收藏了

    ?

    ?

    2006xg2011-12-01 23:30
    有時(shí)間看看,mark

    轉(zhuǎn)載于:https://www.cnblogs.com/DamonTang/archive/2012/09/07/2674871.html

    總結(jié)

    以上是生活随笔為你收集整理的UIViewController与UIView的关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。