用于Tinder风格滑动屏幕的Swift iOS动画
我已经建立了一个屏幕非常类似于打火机主屏幕。我已经在可拖动图标上设置了边框,并通过从屏幕顶部设置动画加载下一张卡。此时有2个按钮(1个接受按钮,1个拒绝按钮),当按下这些按钮时,卡会以正确的方向旋转并变换出屏幕。此函数当前完成此动画用于Tinder风格滑动屏幕的Swift iOS动画,ios,swift,cgaffinetransform,Ios,Swift,Cgaffinetransform,我已经建立了一个屏幕非常类似于打火机主屏幕。我已经在可拖动图标上设置了边框,并通过从屏幕顶部设置动画加载下一张卡。此时有2个按钮(1个接受按钮,1个拒绝按钮),当按下这些按钮时,卡会以正确的方向旋转并变换出屏幕。此函数当前完成此动画 func rejectAnimation() { let scale = CGAffineTransformMakeScale(1, 1) let translate = CGAffineTransformMakeTranslation(0, 0)
func rejectAnimation() {
let scale = CGAffineTransformMakeScale(1, 1)
let translate = CGAffineTransformMakeTranslation(0, 0)
self.cardUIView.transform = CGAffineTransformConcat(scale, translate)
springWithCompletion(0.75, animations: {
let rotate = CGAffineTransformMakeRotation(CGFloat(-M_PI_2))
let translate = CGAffineTransformMakeTranslation((-375), 0)
self.cardUIView.transform = CGAffineTransformConcat(rotate, translate)
}, completion: { finished in 0
self.refreshView()
})
}
及
我的问题是。我如何设置动画,以便当用户拖动一张卡并将其放到右边界或左边界的外侧时,该卡会继续沿重新设置为新卡之前刷卡的方向移出屏幕
注意:springWithCompletion是一个函数,它在一段时间内执行其中的动画。只需使用UIPangestureRecognitor并计算两点之间的差异,即可知道动画的方向(处理程序被调用多次)。如果需要同时设置x轴和y轴的动画,则会变得更复杂
let panGesture = UIPanGestureRecognizer(target: self, action: Selector("onPan:"))
cardView.addGestureRecognizer(panGesture)
func onPan(gestureRecognizer: UIPanGestureRecognizer) {
let point = gestureRecognizer.locationInView(maskView)
看看这个。用swift 4书写
func beingDragged(_ gestureRecognizer: UIPanGestureRecognizer) {
xFromCenter = gestureRecognizer.translation(in: self).x
yFromCenter = gestureRecognizer.translation(in: self).y
switch gestureRecognizer.state {
case .began:
originalPoint = self.center;
break;
case .changed:
let rotationStrength = min(xFromCenter / ROTATION_STRENGTH, ROTATION_MAX)
let rotationAngel = .pi/8 * rotationStrength
let scale = max(1 - fabs(rotationStrength) / SCALE_STRENGTH, SCALE_MAX)
center = CGPoint(x: originalPoint.x + xFromCenter, y: originalPoint.y + yFromCenter)
let transforms = CGAffineTransform(rotationAngle: rotationAngel)
let scaleTransform: CGAffineTransform = transforms.scaledBy(x: scale, y: scale)
self.transform = scaleTransform
updateOverlay(xFromCenter)
break;
case .ended:
afterSwipeAction()
break;
case .possible:break
case .cancelled:break
case .failed:break
}
}
感谢2018年,最好的方式可能是进行
UIViewControllerAnimatedTransitioning
。。。全样品看起来不错。执行此操作时,您可能需要使用UIViewControllerAnimatedTransitioning
@fattie它只是一个视图而不是视图控制器。所以不一定需要,尼基帕特森。但是当你有一个非常棒的过渡动画时,如果需要的话,你可以“转换”它在VCs之间工作。好的!是的,会的,泰克斯兄弟
func beingDragged(_ gestureRecognizer: UIPanGestureRecognizer) {
xFromCenter = gestureRecognizer.translation(in: self).x
yFromCenter = gestureRecognizer.translation(in: self).y
switch gestureRecognizer.state {
case .began:
originalPoint = self.center;
break;
case .changed:
let rotationStrength = min(xFromCenter / ROTATION_STRENGTH, ROTATION_MAX)
let rotationAngel = .pi/8 * rotationStrength
let scale = max(1 - fabs(rotationStrength) / SCALE_STRENGTH, SCALE_MAX)
center = CGPoint(x: originalPoint.x + xFromCenter, y: originalPoint.y + yFromCenter)
let transforms = CGAffineTransform(rotationAngle: rotationAngel)
let scaleTransform: CGAffineTransform = transforms.scaledBy(x: scale, y: scale)
self.transform = scaleTransform
updateOverlay(xFromCenter)
break;
case .ended:
afterSwipeAction()
break;
case .possible:break
case .cancelled:break
case .failed:break
}
}