UIKit:在touchesMoved移动视图时动画化视图

时间:2010-02-20 14:40:18

标签: iphone animation uikit

所以,我有一个名为MovableBlock的UIView子类。它会覆盖touchesBegantouchesMovedtouchesEndedtouchesCancelled。移动部分工作正常。

MovableBlock移动到屏幕左侧时,它的宽度为130px。当它移动到屏幕的右侧时,它的宽度为80px。我想要调整大小的过渡动画,以便当用户拖动视图时,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];
    }
}

startPositioncolumn都是该类的成员。

在拖动MovableBlock时,它不会调整大小(或动画)。我似乎无法找到任何理由它不应该工作,虽然我也找不到这样做的例子,所以也许有一些我遗漏的微妙技巧。

touchesEnded方法中有另一个动画效果很好,所以我知道动画的一部分工作正常,而不是touchesMoved

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我似乎已经弄明白了。使用setColumn方法中的setBounds似乎没有被frame = [self frame]的后续调用注意到。将框架声明移到顶部,在调用setColumn之上,并重新调整如何确定当前列的宽度解决了问题。

另外,不要混合帧和边界。你只会混淆你的头肉。 : - )