我有一个UIImageView,我尝试根据拖动距离和拖动速度加速。通过加速我的意思是当调用touchesEnded:时,imageView应该在它被拖动的方向上进一步滑动。滑动的距离和速度取决于距离和拖动速度。
此时我可以拖动图像视图并获得拖动的距离+花费的时间。基于此,我可以计算速度和方向向量。
但我正在通过touchesEnded:在imageview上执行的幻灯片挣扎。
我的问题是:在我试图对UIImageView执行这种“滑动”效果是否有任何常见或聪明的方法?
我很乐意接受任何可能有用的解决方案或提示。
感谢。
答案 0 :(得分:-1)
这个问题的解决方案比我预期的要简单得多。以下是我的想法(这是简单的版本,没有所有花哨的代码):
@interface myViewController {
CGPoint _velocity;
CGFloat _damping;
UIImageView *_myImageView;
}
- (void)viewDidLoad {
_velocity = CGPointZero; // x = 0, y = 0
// Accelerate _myImageView
NSTimer *myTimer = [NSTimer scheduledTimerWithTimeInterval:0.02f // Update frequency
target:self
selector:@selector(slideImageView)
userInfo:nil
repeats:YES];
}
@implementation myViewController
- (void)slideImageView {
// No need to move _myImageView when _velocity = 0
if (_velocity.x > 0 && _velocity.y > 0)
CGPoint position; // The next position
position = _myImageView.center;
position.x += _velocity.x / 30;
position.y += _velocity.y / 30;
// Damp _velocity with damping factor
_velocity.x *= _damping;
_velocity.y *= _damping;
// Bounce on edges
if (position.x < X_AXIS_MIN_VALUE || position.x > X_AXIS_MAX_VALUE)
_velocity.x = -_velocity.x;
if (position.y < Y_AXIS_MIN_VALUE || position.y > Y_AXIS_MAX_VALUE)
_velocity.y = -_velocity.y;
// Move
_myImageView.center = position;
}
}
// Move been around by implementing touchesBegan: and touchesMoved:
// There are a million tutorials on how to do this.
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
// Do whatever you need to do and calculate x- and y-axis velocity,
// maybe based on the distance between the last 5 points / time.
CGPoint mySpeed;
mySpeed.x = //the new x speed;
mySpeed.y = //the new y speed
_velocity = mySpeed;
}
@end
上面的代码(+缺少的实现)允许您在屏幕上拖动UIImageView。释放手指时,ImageView将继续在屏幕上滑动,如果被击中则在边缘上弹跳。移动手指的速度越快,ImageView的加速度就越快(根据您计算速度的方式)。
我希望那些在这样的问题上挣扎的人会发现它很有用。