Ios 快速点火效应

Ios 快速点火效应,ios,cocoa-touch,swift,Ios,Cocoa Touch,Swift,如何在Swift中实现打火效果 我的意思是,我有一个图像,如果我向右滑动,我想接受,如果我向左滑动,我想拒绝 我可以使用下面的代码: @IBAction func SwipeRight(sender: UISwipeGestureRecognizer) { UIView.animateWithDuration(1) { self.Imagem.center = CGPointMake(self.Imagem.center.x - 150, self.Imagem.cent

如何在Swift中实现打火效果

我的意思是,我有一个图像,如果我向右滑动,我想接受,如果我向左滑动,我想拒绝

我可以使用下面的代码:

@IBAction func SwipeRight(sender: UISwipeGestureRecognizer) {
    UIView.animateWithDuration(1) {
        self.Imagem.center = CGPointMake(self.Imagem.center.x - 150, self.Imagem.center.y )
    }
    //other things after acception
}


但这样用户就不能取消操作。我想,如果用户从边缘(左或右)滑动到增量距离,它将显示一个图像,让用户现在看到,如果他结束移动,动作将发生。否则,用户可以在不结束移动的情况下返回到大于增量的距离,操作将被取消。

我要感谢提出解决方案的人。遵循我在Stack Overflow许多人的大力帮助下开发的解决方案:

@IBAction func Arrastei(sender: UIPanGestureRecognizer) {
    var origem =  CGPoint(x: 0, y: 0)
    var translation : CGPoint = sender.translationInView(Imagem)

    var txy : CGAffineTransform = CGAffineTransformMakeTranslation(translation.x, -abs(translation.x) / 15)
    var rot : CGAffineTransform = CGAffineTransformMakeRotation(-translation.x / 1500)
    var t : CGAffineTransform = CGAffineTransformConcat(rot, txy);
    Imagem.transform = t

    if (translation.x > 100) {
        LbResultado.textColor = btVerdadeiro.textColor
        LbResultado.text = btVerdadeiro.text
        LbResultado.hidden = false
    } else {
        if (translation.x < -100) {
            LbResultado.textColor = btFalso.textColor
            LbResultado.text = btFalso.text
            LbResultado.hidden = false
        } else {
            LbResultado.hidden = true
        }
    }


    if sender.state == UIGestureRecognizerState.Ended {
        if (translation.x > 100) {
            objJogo.Rodada_Vigente!.Responder(true)
        } else {

            if (translation.x < -100) {
                objJogo.Rodada_Vigente!.Responder(false)
            } else {
                sender.view.transform = CGAffineTransformMakeTranslation(origem.x, origem.y)
                sender.view.transform = CGAffineTransformMakeRotation(0)
            }
        }
    }
}
@iAction func Arrastei(发送方:UIPangestureRecognitor){
var origem=CGPoint(x:0,y:0)
变量转换:CGPoint=sender.translationView(Imagem)
var txy:CGAffineTransform=CGAffineTransformMakeTranslation(translation.x,-abs(translation.x)/15)
var rot:CGAffineTransform=CGAffineTransformMakeRotation(-translation.x/1500)
变量t:cGraffeTransform=cGraffeTransformConcat(rot,txy);
Imagem.transform=t
如果(translation.x>100){
LbResultado.textColor=btVerdadeiro.textColor
LbResultado.text=btVerdadeiro.text
LbResultado.hidden=false
}否则{
如果(翻译.x<-100){
LbResultado.textColor=btFalso.textColor
LbResultado.text=btFalso.text
LbResultado.hidden=false
}否则{
LbResultado.hidden=true
}
}
如果sender.state==UIGestureRecognitizerState.Ended{
如果(translation.x>100){
objJogo.Rodada_Vigente!。响应者(真)
}否则{
如果(翻译.x<-100){
objJogo.Rodada_Vigente!。响应者(错误)
}否则{
sender.view.transform=CGAffineTransformMakeTransform(origem.x,origem.y)
sender.view.transform=CGAffineTransformMakeRotation(0)
}
}
}
}
此解决方案使用:

Imagem-->
UIImageView
-接受或拒绝

LbResultado-->
UITextView
-向用户显示他处于接受或拒绝区域

没有数学计算来设置旋转和平移。我使用的值能给我带来良好的视觉效果。

当用户向左(拒绝)或向右(接受)拖动超过100像素的图像时,会出现操作(接受和拒绝)区域。如果用户结束动作区域外的移动,图像将返回其原始位置


如果有人建议对此代码进行改进,我会很高兴。

最好在此处使用UIPangestureRecognitor并管理其状态,正如您已经了解的那样。对于管理卡来说,创建类管理器是一个很好的解决方案,它将处理卡之间的交互(在前面滑动背景卡)。您可以在这里查看卡和管理器的实现,其中包括拖动、移动背景卡和还原动画的实现。 试试这个:

通过旋转,您可以在这里找到更好的解决方案。参见DraggableView.m


查看此Swift 4库

让panGestureRecognizer=UIPanGestureRecognizer(目标:self,操作:#选择器(self.beingDraged)) AddgestureRecognitor(PangestureRecognitor)

正在拖动func(ugestureRecognitor:UIPangestureRecognitor){

希望这能奏效。让我知道


谢谢

改用
UIPangestureRecognitizer
并将您自己添加为其代理。使用代理方法跟踪触摸并做出相应的响应。您可以参考此库:在swift4中也参考此库。更多描述是否更适合新手…我如何开始制作?当然,我今晚会这样做。H希望有帮助
@IBAction func Arrastei(sender: UIPanGestureRecognizer) {
    var origem =  CGPoint(x: 0, y: 0)
    var translation : CGPoint = sender.translationInView(Imagem)

    var txy : CGAffineTransform = CGAffineTransformMakeTranslation(translation.x, -abs(translation.x) / 15)
    var rot : CGAffineTransform = CGAffineTransformMakeRotation(-translation.x / 1500)
    var t : CGAffineTransform = CGAffineTransformConcat(rot, txy);
    Imagem.transform = t

    if (translation.x > 100) {
        LbResultado.textColor = btVerdadeiro.textColor
        LbResultado.text = btVerdadeiro.text
        LbResultado.hidden = false
    } else {
        if (translation.x < -100) {
            LbResultado.textColor = btFalso.textColor
            LbResultado.text = btFalso.text
            LbResultado.hidden = false
        } else {
            LbResultado.hidden = true
        }
    }


    if sender.state == UIGestureRecognizerState.Ended {
        if (translation.x > 100) {
            objJogo.Rodada_Vigente!.Responder(true)
        } else {

            if (translation.x < -100) {
                objJogo.Rodada_Vigente!.Responder(false)
            } else {
                sender.view.transform = CGAffineTransformMakeTranslation(origem.x, origem.y)
                sender.view.transform = CGAffineTransformMakeRotation(0)
            }
        }
    }
}
-(void)beingDragged:(UIPanGestureRecognizer *)gestureRecognizer
{
    //%%% this extracts the coordinate data from your swipe movement. (i.e. How much did you move?)
    xFromCenter = [gestureRecognizer translationInView:self].x; //%%% positive for right swipe, negative for left
    yFromCenter = [gestureRecognizer translationInView:self].y; //%%% positive for up, negative for down

    //%%% checks what state the gesture is in. (are you just starting, letting go, or in the middle of a swipe?)
    switch (gestureRecognizer.state) {
            //%%% just started swiping
        case UIGestureRecognizerStateBegan:{
            self.originalPoint = self.center;
            break;
        };
            //%%% in the middle of a swipe
        case UIGestureRecognizerStateChanged:{
            //%%% dictates rotation (see ROTATION_MAX and ROTATION_STRENGTH for details)
            CGFloat rotationStrength = MIN(xFromCenter / ROTATION_STRENGTH, ROTATION_MAX);

            //%%% degree change in radians
            CGFloat rotationAngel = (CGFloat) (ROTATION_ANGLE * rotationStrength);

            //%%% amount the height changes when you move the card up to a certain point
            CGFloat scale = MAX(1 - fabsf(rotationStrength) / SCALE_STRENGTH, SCALE_MAX);

            //%%% move the object's center by center + gesture coordinate
            self.center = CGPointMake(self.originalPoint.x + xFromCenter, self.originalPoint.y + yFromCenter);

            //%%% rotate by certain amount
            CGAffineTransform transform = CGAffineTransformMakeRotation(rotationAngel);

            //%%% scale by certain amount
            CGAffineTransform scaleTransform = CGAffineTransformScale(transform, scale, scale);

            //%%% apply transformations
            self.transform = scaleTransform;
            [self updateOverlay:xFromCenter];

            break;
        };
            //%%% let go of the card
        case UIGestureRecognizerStateEnded: {
            [self afterSwipeAction];
            break;
        };
        case UIGestureRecognizerStatePossible:break;
        case UIGestureRecognizerStateCancelled:break;
        case UIGestureRecognizerStateFailed:break;
    }
}
    xFromCenter = gestureRecognizer.translation(in: self).x
    yFromCenter = gestureRecognizer.translation(in: self).y
    switch gestureRecognizer.state {
    //%%% just started swiping
    case .began:
        originalPoint = self.center;
        break;

    //%%% in the middle of a swipe
    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
    }
}