2014-01-11 2 views
4

Я искал пример, показывающий, как реализовать пользовательское UIDynamicBehavior в динамике UIKit. Все учебные пособия и примеры показывают только, как собрать UIDynamicBehavior с использованием примитивов (столкновение, гравитация, привязанность, push, привязка и т. Д.)Как реализовать пользовательское действие UIDynamicBehavior

В моем приложении некоторые виды плавают вокруг экрана (используя динамику), и я хочу заставить их исчезнуть, когда они пересекаются с другими неподвижными видами. Для этого мне захотелось проверить совпадение в методах делегирования UIDynamicAnimator и UICollisionBehavior, но, к сожалению, эти методы не обеспечивают достаточной детализации, чтобы выполнить те тесты, которые мне нужны.

EDIT: видимо, мне пришлось подождать один день, прежде чем ответить на мой вопрос (новый пользователь), поэтому мое решение опубликовано ниже в качестве ответа.

+0

Вы * должны * быть в состоянии ответить на него ... – SamB

+0

Если вы все еще не можете ответить на свой вопрос, вы должны теперь иметь достаточно респ умолять о помощи по поводу, что на HTTP: //meta.stackoverflow .com/ – SamB

+0

Сэм, я теперь смог опубликовать ответ и принять его. Спасибо за помощь! – cridgit

ответ

7

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

Пример кода ниже показывает, как написать собственный класс UIDynamicBehavior, чтобы подключить ваше собственное поведение в UIDynamicAnimator. Я назвал класс UISinkBehavior, потому что он «поглощает» представление, когда представление перемещается по «прогибу».

// UISinkBehavior.h 
#import <UIKit/UIKit.h> 

@protocol UISinkBehaviorDelegate <NSObject> 
- (void)sunk:(id)item; 
@end 

@interface UISinkBehavior : UIDynamicBehavior 
@property (weak, nonatomic) id<UISinkBehaviorDelegate> delegate; 
- (id)initWithItems:(NSMutableArray*)items withSinkhole:(UIView*)sinkhole; 
@end 

// UISinkBehavior.m 
#import "UISinkBehavior.h" 

@interface UISinkBehavior() 
@property (nonatomic) NSMutableArray *items; 
@property (nonatomic) id<UIDynamicItem> sinkhole; 
@end 

@implementation UISinkBehavior 

- (id)initWithItems:(NSMutableArray*)items withSinkhole:(UIView*)sinkhole 
{ 
    if (self = [super init]) 
    { 
     _items = items; 
     _sinkhole = sinkhole; 
     // weak self ref to avoids compiler warning about retain cycles 
     __weak typeof(self) ref = self; 
     // this is called by the UIDynamicAnimator on every tick 
     self.action = ^{ 
      UIView *item; 
      // check each item if it overlaps sinkhole 
      for (item in ref.items) 
       if (CGRectIntersectsRect(item.frame, sinkhole.frame)) 
       { 
        // sink it (handled by delegate 
        [ref.delegate sunk:item]; 
        // remove item from animation 
        [ref.items removeObject:item]; 
        // remove behaviour from animator when last item sunk 
        if (ref.items.count < 1) 
         [ref.dynamicAnimator removeBehavior:ref]; 
       } 
     }; 
    }  
    return self; 
} 
@end 
Смежные вопросы