在UIView中更改实例变量错误动画

时间:2015-06-03 11:14:33

标签: ios objective-c animation uiview

我在尝试从头开始制作自定义“滑动”对象时遇到问题。我有一个视图self.taskView,它应该粘在左边或坚持到右边。这工作正常,直到我尝试更改名为state的实例变量的self.task

这是一个“正确”工作的(webm)动画:not_working.webm

但这只适用于我不更改实例变量self.task.state

的情况

这是一个(webm)动画,它无法正常工作:{{3}}

所以我知道正是代码改变了错误的任务状态,因为如果我只是注释掉所有[self setState:BOOL]语句,就像在“working.webm”中看到的一样。

任何提示或想法都表示赞赏。但我是新手所以如果可能的话请保持简单。

// Code to move the green UIview right or left
-(IBAction)handlePan:(UIPanGestureRecognizer *)sender {

if (sender.state == UIGestureRecognizerStateBegan) {
    self.origin = CGPointMake(self.taskView.frame.origin.x, self.taskView.frame.origin.y);

} else if (sender.state == UIGestureRecognizerStateChanged) {

    CGPoint touchLocation = [sender locationInView:self];

    CGPoint location = CGPointMake(touchLocation.x, (self.taskView.frame.size.height/2));

    self.taskView.center = location;

} else if (sender.state == UIGestureRecognizerStateEnded) {

    if (self.origin.x == 0) {
        // Stick right
        if (self.taskView.center.x > ((self.frame.size.width/10)*4)) {
            [self setPosition:NO]; // This sets the position of the view
            [self setState:NO]; // This code is bugging the "animation"

        } else { // Else stick to the left
            [self setPosition:YES];
            [self setState:YES];
        }
    } else {
        // Stick left
        if (self.taskView.center.x < ((self.frame.size.width/10)*6)) {
            [self setPosition:YES];
            [self setState:YES];

        } else { // Else stick right
            [self setPosition:NO];
            [self setState:NO];
        }
    }

    /*[UIView animateWithDuration:0.2
                          delay:0.01
                        options:UIViewAnimationOptionAllowUserInteraction
                     animations:^
     {
         [self.taskView setFrame:position];
     } completion:^(BOOL finished){
     }];*/

} else if (sender.state == UIGestureRecognizerStateCancelled) {

}
}

// THIS METHOD IS BUGGING THE "ANIMATION"
- (void)setState:(BOOL)state {
    self.task.state = [NSNumber numberWithBool:state];
}

1 个答案:

答案 0 :(得分:0)

我认为问题在于您尝试在主线程上运行耗时的方法,这就是您的动画不稳定的原因。

您提到的问题就在这里:

both to the same node

这是一种方法,它可能不仅仅是更改属性(根据我的评论理解这是一个数据库对象)

您可以做的是在后台线程上更新此对象:

- (void)setState:(BOOL)state {
    self.task.state = [NSNumber numberWithBool:state];
}