我正试图在屏幕上移动一个UIView。
UIGravityBehavior和UIPushBehavior都考虑了密度、速度和摩擦力等因素。我试图实现我自己的动态行为忽略了这些物理。
我的UIDynamicBehavior子类和一些基本实现
// MYDynamicBehavior.h
@interface MYDynamicBehavior : UIDynamicBehavior
- (void)addItem:(id<UIDynamicItem>)item;
- (void)removeItem:(id<UIDynamicItem>)item;
@end
// MYDynamicBehavior.m
@interface MYDynamicBehavior ()
@property (strong, nonatomic) NSMutableArray *items;
@end
@implementation MYDynamicBehavior
- (void (^)(void))action
{
__weak MYDynamicBehavior *weakSelf = self;
for (UIView *item in weakSelf.items)
item.center = CGPointMake(item.center.x + 10.0, item.center.y);
}
- (instancetype)init
{
if (self=[super init]) {
__weak MYDynamicBehavior *weakSelf = self;
weakSelf.action = ^{
for (UIView *item in weakSelf.items)
item.center = CGPointMake(item.center.x + 10.0, item.center.y);
};
}
return self;
}
- (void)addItem:(id<UIDynamicItem>)item
{
[self.items addObject:item];
}
@end
// ViewController.m
// #includes
@interface ViewController ()
@property (strong, nonatomic) UIDynamicAnimator *ani;
@property (strong, nonatomic) UIView *kin;
@property (strong, nonatomic) MYDynamicBehavior *skywalk;
@end
@implementation ViewController
…
- (void)viewDidLoad
{
[super viewDidLoad];
self.ani = [[UIDynamicAnimator alloc] init];
self.kin = // some view
self.skywalk = [[MYDynamicBehavior alloc] init];
[self.ani addBehavior:self.skywalk];
[self.skywalk addItem:kin];
}
@end我试着从记忆中重新创造这个,我想基本的东西就在这里
无论如何,我从文档中得到的印象是,动作属性是我需要实现动画的地方。然而,我的行动似乎从未被称为“黑色”。
This是我找到的最接近解决方案的方法,但我仍然没有解决这个问题。
我遗漏了什么?为什么我的自定义UIDynamicBehavior子类不能工作?
发布于 2014-05-23 07:53:28
我还没有找到明确说明这一点的文档,我也无法猜测其中的根本原因,但我发现,如果我的自定义UIDynamicBehavior类调用它们的操作块,只有在添加了至少有一项的子行为时才会调用它们的操作块。
这很奇怪,我认为我正在经历一个副作用,而不是这样的工作,但这确实是可靠的行动块启动。不过,如果有人能弄清楚原因,我会很感兴趣的。:1
https://stackoverflow.com/questions/21397249
复制相似问题