使用平移的 UIImageView 移动不完全平滑
Posted
技术标签:
【中文标题】使用平移的 UIImageView 移动不完全平滑【英文标题】:UIImageView movement using pan not completely smooth 【发布时间】:2013-08-12 16:42:04 【问题描述】:我正在开发一个简单的图像交换应用程序,类似于 Tinder 的用户界面,用户可以使用平移手势交换/导航图像。我遇到了一个小问题,这确实困扰着我,我无法真正理解它为什么会发生 - 由于我的平移方法正常工作,它似乎仍然不像 tinder 那样“流畅”。 uiimageview 的动画/重绘没有那么清晰,我不知道为什么。我的代码是相当教科书平移方法:
-(void)HandlePan:(UIGestureRecognizer *)recognizer
CGPoint translation = [recognizer translationInView:self.view];
[UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut animations:^[recognizer.view setCenter:(CGPointMake(recognizer.view.center.x+translation.x * 1.50,recognizer.view.center.y +translation.y* 1.50))]; completion:nil];
CGPoint leftOutOfBounds = CGPointMake(-160, 160);
CGPoint rightOutOfBounds = CGPointMake(480, 160);
CGPoint velocity = [recognizer velocityInView:self.view];
if(_imagePreviewerTop.center.x > self.view.center.x)
if(velocity.x > 0)
swipeTransform = swipeTransform+.005;
[_decisionLabel setText:@"UPVOTE"];
[_decisionLabel setBackgroundColor:[UIColor successColor]];
[_decisionLabel setTextColor:[UIColor whiteColor]];
else if (velocity.x < 0)
swipeTransform = swipeTransform-.005;
[_imagePreviewerTop setTransform:CGAffineTransformMakeRotation(swipeTransform)];
else if(_imagePreviewerTop.center.x < self.view.center.x)
//NSLog(@"gesture went left");
if(velocity.x < 0)
swipeTransform = swipeTransform-.005;
[_decisionLabel setText:@"PASS"];
[_decisionLabel setBackgroundColor:[UIColor infoBlueColor]];
[_decisionLabel setTextColor:[UIColor whiteColor]];
else if(velocity.x > 0)
swipeTransform = swipeTransform+.005;
//NSLog(@"gesture went left");
[_imagePreviewerTop setTransform:CGAffineTransformMakeRotation(swipeTransform)];
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
if(recognizer.state == UIGestureRecognizerStateEnded)
//implement repositioning here
if (_imagePreviewerTop.center.x <50)
//"finger lifted on left"
[UIView animateWithDuration:.25 animations:^_imagePreviewerTop.center = leftOutOfBounds;
completion:^(BOOL isFinished)
if (isFinished == true)
[self changeImage:@"0"];
];
else if (_imagePreviewerTop.center.x > 270)
//"finger lifted on right"
//[self.view addSubview:_upVote];
[UIView animateWithDuration:.25 animations:^_imagePreviewerTop.center = rightOutOfBounds; completion:^(BOOL isFinished)
if (isFinished == true)
[self changeImage:@"1"];
];
else
[UIView animateWithDuration:.5 animations:^_imagePreviewerTop.center =_imagePreviewerBottom.center;[_imagePreviewerTop setTransform:CGAffineTransformMakeRotation(0.0)];swipeTransform = 0; completion:^(BOOL isFinished)
if (isFinished == true)
[_decisionLabel setText:@"start swiping!"];
[_decisionLabel setBackgroundColor:[UIColor babyBlueColor]];
[_decisionLabel setTextColor:[UIColor infoBlueColor]];
];
还有什么我应该做的吗?我在下面有更多代码处理图像的速度和位置,但我认为它与问题无关。我还尝试了其他一些实现“拖动”感觉的方法,但它们似乎都没有100% 流畅。
任何帮助将不胜感激,谢谢!
【问题讨论】:
recognizer.view setcenter 是 UIImageView 移动的原因,因为它是附加到 Iview 的手势。 嗨 Roy.. 为了实现像 Tinder 这样的 UI,你创建了两个 UIImageViews 吗?我在实现滑动和旋转时遇到问题。请您提供更多代码。 @idev 是的,我所做的是放了两个 UIImageView - 一个响应平移手势并且可以拖动的动态的,然后是最初在第一个后面但显示图像的静态的。一旦动态图像视图被扔出屏幕,我将其重新定位回其原始位置(直接在静态图像视图上方)并将其图像设置为静态图像视图的图像,使其看起来有两个交替的图像视图但实际上允许用户只移动一个。如果您有更多问题,请在 gmail dot com 的 royherma 给我发电子邮件 【参考方案1】:在做了一些研究后,我发现由于我使用 ios 的核心图形(圆角、阴影等)绘制了非常复杂的视图,解决方案是将视图的“shouldRasterize”属性设置为 YES 并修复问题。
谢谢你。
【讨论】:
【参考方案2】:尝试像这样为运动设置动画:
[UIView animateWithDuration:0.1
delay:0.0
options:UIViewAnimationCurveEaseInOut
animations:^
[recognizer.view setCenter:CGPointMake(recognizer.view.center.x+translation.x * 1.50,recognizer.view.center.y +translation.y* 1.50)];
completion:nil];
【讨论】:
我已经添加了完整的方法,也许这将有助于理解为什么会发生这种情况。以上是关于使用平移的 UIImageView 移动不完全平滑的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Unity 中让 GameObjects 在屏幕上平滑平移?