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 演示 - 类似俄罗斯方块
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,不错!