2010-02-20 2 views
1

Итак, у меня есть подкласс UIView под названием MovableBlock. Он отменяет touchesBegan, touchesMoved, touchesEnded и touchesCancelled. Движущаяся часть работает отлично.UIKit: Анимация вида во время его перемещения с помощью touchhesMoved

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

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

// 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.

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

ответ

0

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

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

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