UIKit: анимация вида во время его перемещения с помощью touchsMoved - PullRequest
1 голос
/ 20 февраля 2010

Итак, у меня есть подкласс UIView с именем MovableBlock. Он переопределяет touchesBegan, touchesMoved, touchesEnded и touchesCancelled. Перемещение части работает просто отлично.

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

Прямо сейчас у меня есть это:

// Handles the start of a touch
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint pt = [[touches anyObject] locationInView:self];
    startLocation = pt;
}

// Handles the continuation of a touch.
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{  
    CGPoint svpt = [[touches anyObject] locationInView:self.superview];
    CGPoint pt = [[touches anyObject] locationInView:self];
    if (svpt.x < 130) {
        [self setColumn:0];
    }
    else {
        [self setColumn:1];
    }

    CGRect frame = [self frame];
    frame.origin.x += pt.x - startLocation.x;
    frame.origin.y += pt.y - startLocation.y;

    [self setFrame: frame];
}

-(void)setColumn: (NSInteger)newColumn {
    column = newColumn;
    if (column != newColumn) {
        [UIView beginAnimations:@"Resize Block" context:nil];
        [UIView setAnimationDuration:0.2];

        if (column == 0) {
            [self setBounds: CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 130, self.bounds.size.height)];
        }
        else {
            [self setBounds: CGRectMake(self.bounds.origin.x, self.bounds.origin.y, 80, self.bounds.size.height)];
        }
        [UIView commitAnimations];
    }
}

startPosition и column являются членами класса.

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

В методе touchesEnded есть еще одна анимация, которая прекрасно работает, поэтому я знаю, что анимационная часть работает, но не в touchesMoved.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 20 февраля 2010

Кажется, я понял это. Использование setBounds в методе setColumn, похоже, не было замечено последующим вызовом frame = [self frame]. Перемещение объявления фрейма вверх, над вызовами setColumn и реструктуризация, как определить ширину текущего столбца решаемых вещей.

Кроме того, не смешивайте рамки и границы. Вы просто перепутаете свои головные уборы. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...