我在尝试从头开始制作自定义“滑动”对象时遇到问题。我有一个视图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];
}
答案 0 :(得分:0)
我认为问题在于您尝试在主线程上运行耗时的方法,这就是您的动画不稳定的原因。
您提到的问题就在这里:
both to the same node
这是一种方法,它可能不仅仅是更改属性(根据我的评论理解这是一个数据库对象)
您可以做的是在后台线程上更新此对象:
- (void)setState:(BOOL)state {
self.task.state = [NSNumber numberWithBool:state];
}