我正在努力实现UIDynamicBehavior的子类

时间:2014-01-28 05:03:53

标签: ios objective-c uikit objective-c-blocks uikit-dynamics

我正试图在屏幕上移动UIView

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

我正试图从记忆中重新创建这个,我认为基础知识在这里

无论如何,从文档中我的印象是action属性是我需要实现动画的地方。但是,似乎我的动作黑色不会被调用。

This是我最接近解决方案的,但我还没有解决这个问题。

我错过了什么?为什么我的自定义UIDynamicBehavior子类不起作用?

1 个答案:

答案 0 :(得分:1)

我还没有找到明确说明这一点的文档,我无法猜测其根本原因,但我发现如果我的自定义UIDynamicBehavior类调用其动作块 只有在添加了至少包含一个项目的子行为时才会显示。

奇怪的是,我认为我遇到了副作用,而不是按预期工作,但这确实可以让动作块被触发。如果有人能够阐明为什么,那将会非常感兴趣。 :1