学习笔记-斯坦福iOS7-第八课:协议,block,动画

本文介绍了iOS中的协议、Block及UIView动画使用方法,并详细讲解了动态动画(Dynamic Animation)的概念与实现方式,包括动力行为、动力项等核心组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Protocols
a. 语法:id<myProtocol> obj;
b. 协议中的方法默认必须实现,@optional 后为可选的,@required 后为必选的;
c. 协议中可以声明属性,类中也需实现;
d. 协议A上还有协议B,那么要想实现协议A,也要实现协议B中必选方法;
e. @protocol NSObject, NSObject累实现了NSObject协议的方法;
f. iOS中协议主要用作委托和数据源,

2. block
a. block内部可以访问外面的局部变量;
b. 局部变量前加 __block ,块里就可以读写了;
c. block内访外面的对象(如:NSString),NSString将会被strong 指针指向,直到block结束,防止NSString提前被释放;
d. ^BOOL(id obj) {
       return TRUE;
    }
这种块里可以明显知道返回类型的,前面不用加BOOL类型:
^(id obj){ ... }
e. 循环引用
. block 存在时,里面引用的对象都有一个强引用;如果该对象再强引用了block,就造成循环引用,无法释放了:
[self.myBlocks addObject:^{
    [self doSomething];
}];
block 强引用self,self也通过myBlocks array强引用block;
. 解决方案:
__weak MyClass *weakSelf = self;
[self.myBlocks addObject:^{
    [weakSelf doSomething];
}];
block 不再强引用self。


3. UIView Animation
A. 改变视图属性:frame,transform,alpha..;
a. Animation class method inUIView:
+ (void)animateWithDuration:(NSTimeInterval)duration
             delay:(NSTimeInterval)delay
options:(UIViewAnimationOptions)options
animations:(void(^)(void))animations
completion:(void(^)(BOOL finished))completion;
注:如果动画期间,其他地方改变了animations里的数值,导致最后结果没有达到预期,completion块不会执行。


b. UIViewAnimationOptions
BeginFromCurrentState : 动画状态从当前值开始,例如动画设置alpha,从0 - 1,开始期间alpha= 0.2了,设置该标记,会从0.2开始;
AllowUserInteraction :是否允许手势,动画期间
淡入淡出等等

B. 视图翻转等动画 
+ (void)transitionWithView:(UIVIew*)view
duration:(NSTimeInterval)duration
options:(UIViewAnimationOptions)options
animations:(void(^)(void))animations
completion:(void(^)(BOOL finished))completion;
 
C. 一个视图到另一个视图
+ (void)transitionFromView:(UIView*)fromView
                    toView:(UIView*)toView
duration:(NSTimeInterval)duration
options:(UIViewAnimationOptions)options
completion:(void(^)(BOOL finished))completion;


4. Dynamic Animation
a. 由动画者(animator),动力行为(behaviors),动力项(items)组成。
b. demo:
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:aView];
UIGravityBehavior *gravity = [[UIGravityBehavior alloc] init];
[animator addBehavior:gravity];

id<UIDynamicItem> item = ...;
[gravity addItem:item];

//要改变UIDynamicItem里的bound,center,变换,需要调用 UIDynamicAnimator 的 updateItemUsingCurrentState 方法;

c. behaviors
.UIGravityBehavior  重力行为
.UICollisionBehavior 碰撞行为
.UIAttachmentBehavior 吸附行为
.UISnapBehavior 速甩行为
.UIPushBehavior 推动行为
.UIDynamicItemBehavior 动力项行为,控制动力项的内部行为
.UIDynamicBehavior 可把上面的行为添加进来 addChildBehavior


5. demo 演示 - 类似俄罗斯方块

分别添加了Dynamic Animation 和 View Animation,不错!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值