2014-01-28 4 views
1

Я пытаюсь переместить UIView по экрану.Я пытаюсь реализовать подкласс UIDynamicBehavior

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 

Я пытаюсь воссоздать это из памяти, я думаю, что основы здесь

Во всяком случае, это мое впечатление от документации, что свойство action - это то, где мне нужно реализовать мою анимацию. Однако не кажется, что мое действие черное когда-либо называется.

This самый близкий я пришел к решению, но я до сих пор не решил эту проблему.

Что мне не хватает? Почему мой подкласс UIDynamicBehavior не работает?

ответ

1

Я не нашел в документации, говорится это в явном виде, и я не могу догадаться, в подоплеке, но я обнаружил, что если мои классы пользовательских UIDynamicBehavior называют свои блоки действий только если есть поведение ребенка добавлено, в котором есть хотя бы один элемент.

Странно, что я думаю, что у меня возникает побочный эффект, а не работающий по назначению, но он надежно активирует блок действий. Было бы действительно интересно, если бы кто-нибудь мог пролить свет на , почему. : 1

Смежные вопросы