Ios UIPanGesture未移动单个视图
我正在Swift上做一个iPhone项目,在我的主屏幕上,我在一个堆栈中添加多个视图 我的要求是能够将每个单独的子视图移动到主屏幕的顶部,如Tinder卡刷卡效果。我正在使用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
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。但是看起来