2014-01-28 21 views
1

我试图在屏幕上移动一个UIView我很努力实现UIDynamicBehavior的一个子类

UIGravityBehaviorUIPushBehavior都将密度,速度和摩擦等因素考虑在内。我试图实现自己的动态行为,忽略这些物理。

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子类不工作?

回答

1

我还没有发现明确指出这个文件,我不能在背后的原因猜测,但我发现,如果我的自定义UIDynamicBehavior类调​​用他们的行动块只有在有孩子的行为添加了至少有一个项目。

这就够了,我认为我遇到的副作用,而不是这方面的工作按预期怪异,但这并可靠地获得操作块火。如果有人能说明为什么会真的很感兴趣。 :1