UISnapBehaviour только по оси X

Есть ли способ заставить UISnapBevahiour работать только вдоль линейной оси X?

Я хочу точное поведение UISnapBehaviour, но не хочу, чтобы он "встряхивал" положение на оси x и y, а только на оси x.

Это для UIView внутри моего contentView ячейки таблицы.

// UIKitDynamics
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self];
CGPoint centerPoint = self.contentView.center;
self.snapBehaviour = [[UISnapBehavior alloc] initWithItem:self.frontView snapToPoint:centerPoint];
[self.snapBehaviour setDamping:1.0f];
[self.animator addBehavior:self.snapBehaviour];
UIDynamicItemBehavior *itemBehaviour = [[UIDynamicItemBehavior alloc] initWithItems:@[self.frontView]];
itemBehaviour.elasticity = 0.0f;
itemBehaviour.allowsRotation = NO;
[self.animator addBehavior:itemBehaviour];

2 ответа

Решение

Я опубликую код, который я использовал для подобных действий, как я уже упоминал в своем комментарии, он использовал анимацию UIView, которая использует UIKit Dynamics, а не использует их напрямую...

[UIView animateWithDuration:0.5
                      delay:0.0
     usingSpringWithDamping:0.5
      initialSpringVelocity:0.3
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{
                   [toView setFrame:_modalFrame];
                 }
                 completion:^(BOOL finished) {
                   [self.context completeTransition:YES];
                 }];

Это представляет модальное представление, которое возникает и колеблется при представлении.

Из документации UIDynamicBehavior этого action блок:

@property(nonatomic, copy) void (^action)(void)

Динамический аниматор вызывает блок действия на каждом шаге анимации.

Поэтому, создавая свое поведение, сделайте что-то вроде этого:

UIView *view = ...
UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:view attachedToAnchor:point];

CGFloat xCoordinate = view.frame.origin.x;
attachment.action = ^{
   if (view.frame.origin.x != xCoordinate) {
        CGRect frame = view.frame;
        frame.origin.x = xCoordinate;
        view.frame = frame;
    }
};

[self.dynamicAnimator addBehavior:attachment];

В моем примере я использую UIAttachmentBehavior, но этот метод также будет работать для любого другого подкласса UIDynamicBehavior, в вашем случае UISnapBehavior.

Другие вопросы по тегам