Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIPanGesture未移动单个视图_Ios_Swift_Uipangesturerecognizer_Tinder - Fatal编程技术网

Ios UIPanGesture未移动单个视图

Ios UIPanGesture未移动单个视图,ios,swift,uipangesturerecognizer,tinder,Ios,Swift,Uipangesturerecognizer,Tinder,我正在Swift上做一个iPhone项目,在我的主屏幕上,我在一个堆栈中添加多个视图 我的要求是能够将每个单独的子视图移动到主屏幕的顶部,如Tinder卡刷卡效果。我正在使用UIPanGesture来实现这一点,这样每个单独的视图都会跟随我在屏幕上的手指 但我的问题是,不是只移动一个屏幕的预期效果,而是所有的视图堆栈在我的主屏幕上一起移动。 在过去的4天里,我一直在解决这个问题。请帮帮我 Xcode版本7.2.1和Swift 2.1 以下是移动ui视图的代码: //For creating ea

我正在Swift上做一个iPhone项目,在我的主屏幕上,我在一个堆栈中添加多个视图

我的要求是能够将每个单独的子视图移动到主屏幕的顶部,如Tinder卡刷卡效果。我正在使用
UIPanGesture
来实现这一点,这样每个单独的视图都会跟随我在屏幕上的手指

但我的问题是,不是只移动一个屏幕的预期效果,而是所有的视图堆栈在我的主屏幕上一起移动。 在过去的4天里,我一直在解决这个问题。请帮帮我

Xcode版本7.2.1和Swift 2.1

以下是移动
ui视图的代码:

//For creating each childView and adding UIPanGestureRecognizer to each childView

func configureInitialViewPlacement() -> Void {
    for var i:Int = cardsArray.count-1; 0 <= i; i--
    {
        let cardView = cardsArray[i]
       let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: "beingDragged:")


        cardView.addGestureRecognizer(panGestureRecognizer)

        self.view.addSubview(cardView)

        var frame = CGRectZero
        var originalFrame = self.view.bounds
        originalFrame = CGRectMake(originalFrame.origin.x+10,originalFrame.origin.y+10 , originalFrame.size.width-20, originalFrame.size.height-20)

        frame.size.height = originalFrame.size.height
        frame.size.width = originalFrame.size.width - CGFloat((2*CGFloat(i)*paddingOffset))
        frame.origin.x = originalFrame.origin.x + CGFloat((CGFloat(i)*paddingOffset))
        frame.origin.y = originalFrame.origin.y + CGFloat((CGFloat(i)*paddingOffset))

        cardView.frame = frame

        cardView.setContentViewForCard(cardDataArray[i])

    }
}

// Method For gestureRecognizer

func beingDragged(gestureRecognizer: UIPanGestureRecognizer) -> Void {
    xFromCenter = Float(gestureRecognizer.translationInView(self.view).x)
    yFromCenter = Float(gestureRecognizer.translationInView(self.view).y)

    switch gestureRecognizer.state {
    case UIGestureRecognizerState.Began:
        self.originPoint = self.view.center
    case UIGestureRecognizerState.Changed:
        let rotationStrength: Float = min(xFromCenter/ROTATION_STRENGTH, ROTATION_MAX)
        let rotationAngle = ROTATION_ANGLE * rotationStrength
        let scale = max(1 - fabsf(rotationStrength) / SCALE_STRENGTH, SCALE_MAX)

        self.view.center = CGPointMake(self.originPoint.x + CGFloat(xFromCenter), self.originPoint.y + CGFloat(yFromCenter))

        let transform = CGAffineTransformMakeRotation(CGFloat(rotationAngle))
        let scaleTransform = CGAffineTransformScale(transform, CGFloat(scale), CGFloat(scale))
        self.view.transform = scaleTransform
        self.updateOverlay(CGFloat(xFromCenter))
    case UIGestureRecognizerState.Ended:
        self.afterSwipeAction()
    case UIGestureRecognizerState.Possible:
        fallthrough
    case UIGestureRecognizerState.Cancelled:
        fallthrough
    case UIGestureRecognizerState.Failed:
        fallthrough
    default:
        break
    }
}


func afterSwipeAction() -> Void {
    let floatXFromCenter = Float(xFromCenter)
    if floatXFromCenter > ACTION_MARGIN {
        self.rightAction()
    } else if floatXFromCenter < -ACTION_MARGIN {
        self.leftAction()
    } else {
        UIView.animateWithDuration(0.3, animations: {() -> Void in
            self.view.center = self.originPoint
            self.view.transform = CGAffineTransformMakeRotation(0)
        })
    }
}

// For Right Swipe

func rightAction() -> Void {
    let finishPoint: CGPoint = CGPointMake(500, 2 * CGFloat(yFromCenter) + self.originPoint.y)
    UIView.animateWithDuration(0.3,
        animations: {
            self.view.center = finishPoint
        }, completion: {
            (value: Bool) in
            self.cardsArray[0].removeFromSuperview()
    })
    delegateforcard.cardSwipedRight(self.cardsArray[0])
}

// For Left Swipe

func leftAction() -> Void {
    let finishPoint: CGPoint = CGPointMake(-500, 2 * CGFloat(yFromCenter) + self.originPoint.y)
    UIView.animateWithDuration(0.3,
        animations: {
            self.view.center = finishPoint
        }, completion: {
            (value: Bool) in
            self.cardsArray[0].removeFromSuperview()
    })
    delegateforcard.cardSwipedLeft(self.cardsArray[0])
}
//用于创建每个子视图并向每个子视图添加UIPangestureRecognitor
func configureInitialViewPlacement()->Void{
对于变量i:Int=cardsArray.count-1;0无效{
xFromCenter=Float(gestureRecognitor.translationView(self.view).x)
yFromCenter=Float(手势识别器.translationView(self.view).y)
切换手势识别器.state{
案例UIgestureRecognitizerState。开始时间:
self.originPoint=self.view.center
案例UIgestureRecognitizerState。已更改:
让旋转强度:浮动=最小值(X从中心/旋转强度,旋转最大值)
让旋转角度=旋转角度*旋转强度
让刻度=最大值(1-fabsf(旋转强度)/刻度强度,刻度最大值)
self.view.center=CGPointMake(self.originPoint.x+CGFloat(xFromCenter),self.originPoint.y+CGFloat(yFromCenter))
let transform=CGAffineTransformMakeRotation(CGFloat(rotationAngle))
设scaleTransform=CGAffineTransformScale(变换、CGFloat(缩放)、CGFloat(缩放))
self.view.transform=scaleTransform
self.updateOverlay(CGFloat(xFromCenter))
案例UIgestureRecognitizerState。结束时间:
self.action()
案例UIgestureRecognitzerState。可能:
失败
案例UIgestureRecognitizerState。已取消:
失败
案例UIgestureRecognitizerState。失败:
失败
违约:
打破
}
}
func afterwipeAction()->Void{
让floatXFromCenter=浮动(xFromCenter)
如果floatXFromCenter>ACTION\u MARGIN{
self.rightAction()
}否则,如果浮动从中心开始<-操作{
self.leftAction()
}否则{
animateWithDuration(0.3,动画:{()->Void in
self.view.center=self.originPoint
self.view.transform=CGAffineTransformMakeRotation(0)
})
}
}
//右击
func rightAction()->Void{
让finishPoint:CGPoint=CGPointMake(500,2*CGFloat(yFromCenter)+self.originPoint.y)
UIView.animateWithDuration(0.3,
动画:{
self.view.center=finishPoint
},完成日期:{
(值:Bool)in
self.cardsArray[0]。removeFromSuperview()
})
delegateforcard.cardSwipedRight(self.cardsArray[0])
}
//左击
func leftAction()->Void{
让finishPoint:CGPoint=CGPointMake(-500,2*CGFloat(yFromCenter)+self.originPoint.y)
UIView.animateWithDuration(0.3,
动画:{
self.view.center=finishPoint
},完成日期:{
(值:Bool)in
self.cardsArray[0]。removeFromSuperview()
})
delegateforcard.cardSwipedLeft(self.cardsArray[0])
}
如果你需要更多的澄清,请告诉我。
谢谢。

我在objective-c中也做了同样的工作,你可以从这里得到一个想法, 这是我的密码

            UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(cardMoving:)];


-(void)cardMoving:(UIPanGestureRecognizer *)gestureRecognizer
{
    xValueFromCenter = [gestureRecognizer translationInView:self].x; // if right positive(+) value, negative for left
    yValueFromCenter = [gestureRecognizer translationInView:self].y; // if swipe up positive(+), negative for down

    switch (gestureRecognizer.state) {
        case UIGestureRecognizerStateBegan:{
            originalPoint = self.center;
            break;
        };
        case UIGestureRecognizerStateChanged:{
            CGFloat rotationStrength = MIN(xValueFromCenter / ROTATION_STRENGTH, ROTATION_MAX);
            CGFloat rotationAngel = (CGFloat) (ROTATION_ANGLE * rotationStrength);
            CGFloat scale = MAX(1 - fabs(rotationStrength) / SCALE_STRENGTH, SCALE_MAX);
            self.center = CGPointMake(originalPoint.x + xValueFromCenter, originalPoint.y + yValueFromCenter);
            CGAffineTransform transform = CGAffineTransformMakeRotation(rotationAngel);
            CGAffineTransform scaleTransform = CGAffineTransformScale(transform, scale, scale);
            self.transform = scaleTransform;
            [self updateOverlay:xValueFromCenter];
            break;
        };
        case UIGestureRecognizerStateEnded: {
            [self afterSwipeAction];
            break;
        };
        case UIGestureRecognizerStatePossible:break;
        case UIGestureRecognizerStateCancelled:break;
        case UIGestureRecognizerStateFailed:break;
    }
}

-(void)updateOverlay:(CGFloat)distance
{
    if (distance > 0) {
        overlayView.Direction = GGOverlayViewDirectionRight;
    } else {
        overlayView.Direction = GGOverlayViewDirectionLeft;
    }
    overlayView.alpha = MIN(fabs(distance)/100, 0.7);
}

- (void)afterSwipeAction
{
    if (xValueFromCenter > ACTION_MARGIN) {
        [self rightAction];
    } else if (xValueFromCenter < -ACTION_MARGIN) {
        [self leftAction];
    } else { //for reseting the card
        [UIView animateWithDuration:0.3
                         animations:^{
                             self.center = originalPoint;
                             self.transform = CGAffineTransformMakeRotation(0);
                             overlayView.alpha = 0;
                         }];
    }
}
uipangestrerecognizer*pangestrerecognizer=[[uipangestrerecognizer alloc]initWithTarget:self action:@selector(cardMoving:)];
-(无效)卡片移动:(UIPangestureRecognitor*)手势识别器
{
xValueFromCenter=[GestureRecognitor TranslationView:self].x;//如果右侧为正(+)值,则左侧为负
yValueFromCenter=[GestureRecognitor TranslationView:self].y;//如果向上滑动正(+),则向下滑动负(+)
开关(手势识别器状态){
案例UIgestureRecognitzerStateStart:{
原点=自中心;
打破
};
案例UIgestureRecognitzerStateChanged:{
CGFloat旋转强度=最小值(x中心值/旋转强度,旋转最大值);
CGFloat旋转角度=(CGFloat)(旋转角度*旋转强度);
CGFloat刻度=最大值(1-fabs(旋转强度)/刻度强度,刻度最大值);
self.center=CGPointMake(originalPoint.x+xValueFromCenter,originalPoint.y+yValueFromCenter);
CGAffineTransform transform=CGAffineTransformMakeRotation(rotationAngel);
CGAffineTransform scaleTransform=CGAffineTransformScale(变换、缩放、缩放);
self.transform=scaleTransform;
[self-updateOverlay:xValueFromCenter];
打破
};
案例UIgestureRecognitzerStateEnded:{
[自我行动];
打破
};
案例UIgestureRecognitzerState可能:中断;
案例UIgestureRecognitzerStateConcelled:中断;
案例UIgestureRecognitzerStateFailed:中断;
}
}
-(无效)更新覆盖:(CGFloat)距离
{
如果(距离>0){
overlayView.Direction=GGOverlayView方向右侧;
}否则{
overlayView.Direction=GGOverlayView方向左;
}
overlayView.alpha=MIN(晶圆间距)/100,0.7);
}
-(无效)行动
{
如果(xValueFromCenter>动作\u边距){
[自我权利行动];
}else if(xValueFromCenter<-动作\u裕度){
[自我行动];
}else{//用于重置卡
[UIView animateWithDuration:0.3
动画:^{
自中心=原点;
self.transform=CGAffineTransformMakeRotation(0);
overlayView.alpha=0;
}];
}
}
谢谢Hites。但是看起来