亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

(8/18)重學Standford_iOS7開發_協議、block、動畫_課程筆記

2019-11-14 18:45:01
字體:
來源:轉載
供稿:網友

第八課:

  1、協議

    另一種安全處理id類型的方式如:id <MyPRotocol> obj

    a.聲明

//協議一般放于.h文件中或者在類的.h文件中@protocol Foo <Xyzzy, NSObject>//<>中的內容表示還需實現自哪些協議,所有協議的根協議一般都是NSObject- (void)someMethod;//默認為必須實現的方法@optional//可選方法聲明- (void)methodWithArgument:(BOOL)argument;@required@property (readonly) int readonlyProperty; //只有getter在協議中@property NSString *readwriteProperty; //getter與setter都在協議中 - (int)methodThatReturnsSomething;@end

    b.在類中實現協議

#import “Foo.h” @interface MyClass : NSObject <Foo> ???//(do not have to declare Foo’s methods again here, it’s implicit that you implement it)@end//或者私有實現@interface MyClass() <Foo>@end@implementation MyClass//@required methods here! @end

    c.用途

     ?、傥?/p>

     ?、跀祿?/p>

//UI與controller盲通信的方式@property (nonatomic, weak) id <UISomeObjectDelegate> delegate;@property (nonatomic, weak) id <UISomeObjectDataSource> dataSource;

      ③動畫

  2、Block(來源于API文檔)

    實際上為一段代碼塊,類似于C語言中的函數指針

    a.聲明

int multiplier = 7;int (^myBlock)(int) = ^(int num) {    return num * multiplier;};//int 為block返回值 //^表示為此為代碼塊//myBlock為此代碼塊名//int 為參數類型//等號右邊為block實現

    block可以使用和他的同一范圍內聲明的變量,使用block與使用C函數類似

int multiplier = 7;int (^myBlock)(int) = ^(int num) {    return num * multiplier;}; printf("%d", myBlock(3));// prints "21"

    b.直接使用block

      block可以省略block聲明直接使用

char *myCharacters[3] = { "TomJohn", "George", "Charles Condomine" };//直接使用block作為參數 qsort_b(myCharacters, 3, sizeof(char *), ^(const void *l, const void *r) {    char *left = *(char **)l;    char *right = *(char **)r;    return strncmp(left, right, 1);}); // myCharacters is now { "Charles Condomine", "George", "TomJohn" } 

    c.Cocoa中使用block

NSArray *stringsArray = @[ @"string 1",                           @"String 21",                           @"string 12",                           @"String 11",                           @"String 02" ]; static NSStringCompareOptions comparisonOptions = NSCaseInsensitiveSearch | NSNumericSearch |        NSWidthInsensitiveSearch | NSForcedOrderingSearch;NSLocale *currentLocale = [NSLocale currentLocale]; //比較器為代碼塊NSComparator finderSortBlock = ^(id string1, id string2) {    NSRange string1Range = NSMakeRange(0, [string1 length]);    return [string1 compare:string2 options:comparisonOptions range:string1Range locale:currentLocale];}; NSArray *finderSortArray = [stringsArray sortedArrayUsingComparator:finderSortBlock];NSLog(@"finderSortArray: %@", finderSortArray); /*Output:finderSortArray: (    "string 1",    "String 02",    "String 11",    "string 12",    "String 21")*/

    d.__block變量

      首先看簡單的例子

//直接使用變量int x = 123; void (^printXAndY)(int) = ^(int y) {    printf("%d %d/n", x, y);}; printXAndY(456); // prints: 123 456//不可以直接更改變量,此處變量對block來說為只讀int x = 123;void (^printXAndY)(int) = ^(int y) {    x = x + y; // error    printf("%d %d/n", x, y);};

      解決方法,引入__block變量

__block int x = 123; //  x lives in block storage void (^printXAndY)(int) = ^(int y) {    x = x + y;    printf("%d %d/n", x, y);};printXAndY(456); // prints: 579 456// x is now 579

    e.各種類型的變量在block中的使用

      對于普通局部變量,在block聲明時保存其值,之后普通局部變量的改變對block不可見

//注意block的調用時機extern NSInteger CounterGlobal;//block對全局變量有讀寫權限static NSInteger CounterStatic;//靜態變量{    NSInteger localCounter = 42;//普通本地變量    __block char localCharacter;//__block本地變量     void (^aBlock)(void) = ^(void) {        ++CounterGlobal;        ++CounterStatic;        CounterGlobal = localCounter; // localCounter fixed at block creation        localCharacter = 'a'; // sets localCharacter in enclosing scope    };     ++localCounter; // unseen by the block,對block不可見,block的值認為42    localCharacter = 'b';     aBlock(); // execute the block    // localCharacter now 'a'}

    f.對象在block中的使用

dispatch_async(queue, ^{    /*     block中訪問實例變量,instanceVariable為block所在類的實例變量,此時直接訪問了實例變量,因此需要對包含它的對象(self)保留    */    doSomethingWithObject(_instanceVariable);});  id localVariable = _instanceVariable;dispatch_async(queue, ^{    /*    在本地創建了指向實例變量的引用,因此需要保留localVariable而不是self    */    doSomethingWithObject(localVariable);});

    g.使用typedef聲明block

typedef float (^MyBlockType)(float, float); MyBlockType myFirstBlock = // ... ;MyBlockType mySecondBlock = // ... ;

    h.Memory Cycles 

//block中引用self,所以有強指針指向self,而block又在self中定義,所以self又有強指針指向block[self.myBlocks addObject:^ {    [self doSomething];}];

      解決方法

__weak MyClass *weakSelf = self; //重新聲明為弱引用[self.myBlocks addObject:^ {    [weakSelf doSomething];}];

    i.用途

      枚舉,動畫,排序,通知(Notification),Error handlers,Completion handlers (錯誤與完成事件的處理,可以理解為回調函數),多線程

  3、動畫(Animation)

    a.動畫的種類

      Animating views :視圖動畫,包括移動、縮放、淡入淡出、旋轉等

      Animation of View Controller transitions:視圖控制器動畫,視圖的切換等

      Core Animation:核心動畫框架

      本節課只涉及視圖動畫

    b.為視圖添加動畫的三種方法

      ①通過設置視圖屬性

        frame

        transform (translation, rotation and scale)

        alpha (opacity) 

       值會立即改變,但動畫效果會延時

+ (void)animateWithDuration:(NSTimeInterval)duration                                  delay:(NSTimeInterval)delay                               options:(UIViewAnimationOptions)options                          animations:(void (^)(void))animations                          completion:(void (^)(BOOL finished))completion;//適用于常規動畫設置//example[UIView animateWithDuration:3.0                      delay:0.0                    options:UIViewAnimationOptionBeginFromCurrentState                 animations:^{ myView.alpha = 0.0; }                 completion:^(BOOL fin) { if (fin) [myView removeFromSuperview]; }];//視圖在3秒內從父視圖淡出,完成動畫后并移除自己+ (void)transitionWithView:(UIView *)view                  duration:(NSTimeInterval)duration                   options:(UIViewAnimationOptions)options                animations:(void (^)(void))animations                completion:(void (^)(BOOL finished))completion;//適用于轉場動畫設置,比如卡牌的翻轉+ (void)transitionFromView:(UIView *)fromView                    toView:(UIView *)toView                  duration:(NSTimeInterval)duration                   options:(UIViewAnimationOptions)options                completion:(void (^)(BOOL finished))completion;//適用于切換視圖動畫

 

//UIViewAnimationOptions//常規動畫屬性設置(可以同時選擇多個進行設置)UIViewAnimationOptionLayoutSubviews          //父視圖變化時自動更新子視圖約束@see:http://segmentfault.com/q/1010000002872390 UIViewAnimationOptionAllowUserInteraction      //動畫時響應用戶事件,如 touch等   UIViewAnimationOptionBeginFromCurrentState     //從當前狀態開始動畫,比如此時有動畫正在改變屬性UIViewAnimationOptionRepeat                    //無限制重復動畫UIViewAnimationOptionAutoreverse               //執行動畫回路(動畫運行到結束點后仍然以動畫方式回到初始點),前提是設置動畫無限重復UIViewAnimationOptionOverrideInheritedDuration //忽略嵌套動畫時間設置UIViewAnimationOptionOverrideInheritedCurve    //忽略嵌套動畫速度設置UIViewAnimationOptionAllowAnimatedContent      //動畫過程中重繪視圖(注意僅僅適用于轉場動畫)UIViewAnimationOptionShowHideTransitionViews   //視圖切換時直接隱藏舊視圖、顯示新視圖,而不是將舊視圖從父視圖移除(僅僅適用于轉場動畫)UIViewAnimationOptionOverrideInheritedOptions  //不繼承父動畫設置或動畫類型//動畫速度控制(可從其中選擇一個設置)UIViewAnimationOptionCurveEaseInOut           //動畫先緩慢,然后逐漸加速UIViewAnimationOptionCurveEaseIn               //動畫逐漸變慢UIViewAnimationOptionCurveEaSEOut              //動畫逐漸加速UIViewAnimationOptionCurveLinear              //動畫勻速執行,默認值//轉場類型(僅適用于轉場動畫設置,可以從中選擇一個進行設置,基本動畫、關鍵幀動畫不需要設置)UIViewAnimationOptionTransitionNone            //沒有轉場動畫效果UIViewAnimationOptionTransitionFlipFromLeft    //從左側翻轉效果UIViewAnimationOptionTransitionFlipFromRight   //從右側翻轉效果UIViewAnimationOptionTransitionCurlUp          //向后翻頁的動畫過渡效果UIViewAnimationOptionTransitionCurlDown        //向前翻頁的動畫過渡效果UIViewAnimationOptionTransitionCrossDissolve   //舊視圖溶解消失顯示下一個新視圖的效果UIViewAnimationOptionTransitionFlipFromTop     //從上方翻轉效果UIViewAnimationOptionTransitionFlipFromBottom  //從底部翻轉效果

     ?、贒ynamic Animator :動力動畫

        實現步驟:a.創建一個UIDynamicAnimator

             b.向UIDynamicAnimator添加UIDynamicBehaviors(gravity, collisions, etc.)

             c.向UIDynamicAnimator添加UIDynamicItems(usually UIViews) 

             d.動畫自動運行

//Create a UIDynamicAnimatorUIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:aView];//Create and add UIDynamicBehaviorsUIGravityBehavior *gravity = [[UIGravityBehavior alloc] init]; [animator addBehavior:gravity];UICollisionBehavior *collider = [[UICollisionBehavior alloc] init]; [animator addBehavior:collider];//Add UIDynamicItems to a UIDynamicBehaviorid <UIDynamicItem> item1 = ...; id <UIDynamicItem> item2 = ...; [gravity addItem:item1]; [collider addItem:item1]; [gravity addItem:item2];
//UIDynamicItem 協議@protocol UIDynamicItem@property (readonly) CGRect bounds;@property (readwrite) CGPoint center;@property (readwrite) CGAffineTransform transform; @end//一般UIView即可作為Item,天生實現了UIDynamic協議//以上屬性一般有動畫運行時的animator來改變,若需要主動改變,需要調用- (void)updateItemUsingCurrentState:(id <UIDynamicItem>)item;

         UIDynamicBehaviors

//UIGravityBehavior@property CGFloat angle;//重力方向,默認向下@property CGFloat magnitude; // 1.0 is 1000 points/s/s//UICollisionBehavior 碰撞@property UICollisionBehaviorMode collisionMode; // Items,Boundaries,Everything (default) - (void)addBoundaryWithIdentifier:(NSString *)identifier forPath:(UIBezierPath *)path; //用UIBezierPath自定義碰撞邊界@property BOOL translatesReferenceBoundsIntoBoundary;//參考視圖(動力動畫的頂級視圖)作為碰撞邊界//UIAttachmentBehavior 吸附行為- (instancetype)initWithItem:(id <UIDynamicItem>)item attachedToAnchor:(CGPoint)anchor;//以點作為吸附- (instancetype)initWithItem:(id <UIDynamicItem>)i1 attachedToItem:(id <UIDynamicItem>)i2;//以動力項作為吸附,兩個動力項的吸附- (instancetype)initWithItem:(id <UIDynamicItem>)item offsetFromCenter:(CGPoint)offset ... //偏移中心的吸附@property (readwrite) CGFloat length; // 吸附的長度@property (readwrite) CGPoint anchorPoint; // 吸附點@property (readwrite, nonatomic) CGFloat damping; // 錨點移動時的阻尼@property (readwrite, nonatomic) CGFloat frequency; // 錨點移動時的頻率//UISnapBehavior 捕捉行為- (instancetype)initWithItem:(id <UIDynamicItem>)item snapToPoint:(CGPoint)point; @property CGFloat damping;.//移動到錨點時振動的阻尼//UIPushBehavior 推動行為@property UIPushBehaviorMode mode; // Continuous or Instantaneous@property CGVector pushDirection;@property CGFloat magnitude/angle; // magnitude 1.0 moves a 100x100 view at 100 pts/s/s//UIDynamicItemBehavior 動力項行為,應用于所有Items@property (readwrite, nonatomic) CGFloat elasticity; // 彈力,[0.1]@property (readwrite, nonatomic) CGFloat friction; //摩擦力,0表示無摩擦力@property (readwrite, nonatomic) CGFloat density; // 密度,默認為1@property (readwrite, nonatomic) CGFloat resistance; //線性阻力系數0--CGFLOAT_MAX@property (readwrite, nonatomic) CGFloat angularResistance; //角度阻力系數0--CGFLOAT_MAX@property (readwrite, nonatomic) BOOL allowsRotation; //是否允許旋轉- (CGPoint)linearVelocityForItem:(id <UIDynamicItem>)item;//獲取Item速度- (CGFloat)angularVelocityForItem:(id <UIDynamicItem>)item;//獲取Item角速度

         創建UIDynamicBehavior子類實現自定義行為

- (void)addChildBehavior:(UIDynamicBehavior *)behavior;//將其他行為添加到自定義行為中@property UIDynamicAnimator *dynamicAnimator;//獲取當前行為所在的Animator- (void)willMoveToAnimator:(UIDynamicAnimator *)animator;//行為加入到方法或者移除時(此時參數為nil)會調用@property (copy) void (^action)(void);//每當行為發生時總會執行此block,注意調用比較頻繁的效率問題 

  4、demo

    Dropit:https://github.com/NSLogMeng/Stanford_iOS7_Study/commit/515b76c7ed6e74a7e30108efe6d4c833f33a6e0c

 

課程視頻地址:網易公開課:http://open.163.com/movie/2014/1/D/L/M9H7S9F1H_M9H80D0DL.html

       或者iTunes U搜索standford課程


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情一级精品国产| 成人精品久久一区二区三区| 亚洲在线观看视频| 97香蕉超级碰碰久久免费的优势| 91精品国产99| 不卡中文字幕av| 亚洲精品中文字| 亚洲国产中文字幕久久网| 性欧美视频videos6一9| 色婷婷av一区二区三区久久| 亚洲视频一区二区三区| 中文字幕亚洲第一| 91精品啪在线观看麻豆免费| 伊是香蕉大人久久| 国产999精品视频| 国产成人在线视频| 日韩精品中文字幕久久臀| 国产午夜精品麻豆| 国产成人一区二区在线| 久久久久久久久国产精品| 亚洲va电影大全| 国产精品久久久久久久久久免费| 亚洲免费高清视频| 亚洲精品小视频| 日韩国产欧美精品在线| 欧美猛交ⅹxxx乱大交视频| 亚洲精品国产精品自产a区红杏吧| 欧美放荡办公室videos4k| 国产精品视频xxxx| 欧美美女操人视频| 国产亚洲欧美日韩一区二区| 欧美成年人在线观看| 青草成人免费视频| 日韩精品免费在线播放| 亚洲精品成人免费| 这里只有精品在线播放| 性欧美xxxx视频在线观看| 久久综合九色九九| 992tv在线成人免费观看| 欧美大学生性色视频| 91精品国产777在线观看| 日韩欧美亚洲国产一区| 成人情趣片在线观看免费| 日韩欧美精品中文字幕| 亚洲视频电影图片偷拍一区| 国产成一区二区| 色妞一区二区三区| 日韩精品免费综合视频在线播放| 91极品视频在线| 久久99亚洲热视| 欧美一级黑人aaaaaaa做受| 综合国产在线观看| 亚洲成在人线av| 亚洲综合在线做性| 亚洲精品成人久久久| 在线视频日本亚洲性| 激情久久av一区av二区av三区| 69视频在线免费观看| 精品日韩视频在线观看| 亚洲一区二区自拍| 久久久久久久久久久免费精品| 国产精品视频最多的网站| 69av在线播放| 久久艹在线视频| 欧洲一区二区视频| 97精品视频在线观看| 精品免费在线观看| 国产精品pans私拍| 欧美中文字幕第一页| 国产成人一区二区三区| 午夜精品一区二区三区在线视频| 96pao国产成视频永久免费| 日韩在线中文视频| 人人澡人人澡人人看欧美| 精品激情国产视频| 久久国产精品久久国产精品| 欧美在线精品免播放器视频| 日韩中文有码在线视频| 亚洲国产古装精品网站| 国产精品网红福利| 久久精品99无色码中文字幕| 高清在线视频日韩欧美| 日本中文字幕不卡免费| 国产精品激情av电影在线观看| 亚洲国产精品99久久| 91亚洲精品久久久久久久久久久久| 97在线观看视频国产| 欧美性猛交xxxx乱大交| 国产精品在线看| 欧美极品少妇xxxxx| 亚洲另类图片色| 久久视频中文字幕| 青青草99啪国产免费| 日韩欧美国产高清91| 国产一区二区三区在线观看网站| 日韩小视频在线观看| 91亚洲国产成人精品性色| 91免费人成网站在线观看18| 亚洲男人的天堂网站| 国产成+人+综合+亚洲欧洲| 中文一区二区视频| 国产精品久久久久久久天堂| 精品偷拍一区二区三区在线看| 成人羞羞国产免费| 色www亚洲国产张柏芝| 57pao精品| 亚洲裸体xxxx| 国产成人综合一区二区三区| 91精品国产综合久久香蕉的用户体验| 久久久亚洲精品视频| 亚洲国产精品成人精品| 91国自产精品中文字幕亚洲| 欧美午夜激情小视频| 亚洲人成电影网站色| 亚洲激情免费观看| 91在线免费视频| 国产成人精品网站| 亚洲精品免费在线视频| 国产精品视频最多的网站| 国产日韩换脸av一区在线观看| 亚洲一区二区福利| 欧美精品在线免费播放| 日韩欧美中文字幕在线播放| 亚洲免费中文字幕| 在线播放精品一区二区三区| 亚洲成色777777在线观看影院| 亚洲欧美日韩一区在线| 情事1991在线| 亚洲第一av网| 国产经典一区二区| 91wwwcom在线观看| 一本一本久久a久久精品综合小说| 欧美成人免费大片| 亚洲精品第一国产综合精品| 国产精品久久电影观看| 日韩亚洲综合在线| 国产精品视频精品| 日本道色综合久久影院| 色综合视频网站| 青草成人免费视频| 国产狼人综合免费视频| 欧美性jizz18性欧美| 亚洲美女动态图120秒| 国产成人精品免高潮在线观看| 欧美色欧美亚洲高清在线视频| 精品一区精品二区| 欧美激情2020午夜免费观看| 亚洲国产精品va在线观看黑人| 日韩精品丝袜在线| 亚洲四色影视在线观看| 欧美美最猛性xxxxxx| 国产精品久久久久久中文字| 国产精品久久久久久久久免费| 午夜精品一区二区三区在线| 国产91精品网站| 色一情一乱一区二区| 欧美重口另类videos人妖| 亚洲精品国产美女| 亚洲欧美综合另类中字| 国产精品视频公开费视频| 久久久久久久久国产精品| 亚洲热线99精品视频| 久精品免费视频| 成人中心免费视频|