我正在关注本教程http://guti.in/articles/creating-tinder-like-animations/,但我很难搞清楚:
更新:
如何向左或向右通知拖动项目以告诉视图控制器显示新内容,如何根据拖动视图中的视图调用视图控制器中的方法?它们是两个独立的文件viewController.m和这一个......
我怎么说基于这个动作 GGDraggableView.m
#import "GGDraggableView.h"
#import "GGOverlayView.h"
@interface GGDraggableView ()
@property(nonatomic, strong) UIPanGestureRecognizer *panGestureRecognizer;
@property(nonatomic) CGPoint originalPoint;
@property(nonatomic, strong) GGOverlayView *overlayView;
@end
@implementation GGDraggableView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (!self) return nil;
self.panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragged:)];
[self addGestureRecognizer:self.panGestureRecognizer];
self.overlayView = [[GGOverlayView alloc] initWithFrame:self.bounds];
self.overlayView.alpha = 0;
[self addSubview:self.overlayView];
return self;
}
- (void)dragged:(UIPanGestureRecognizer *)gestureRecognizer
{
CGFloat xDistance = [gestureRecognizer translationInView:self].x;
CGFloat yDistance = [gestureRecognizer translationInView:self].y;
switch (gestureRecognizer.state) {
case UIGestureRecognizerStateBegan:{
self.originalPoint = self.center;
break;
};
case UIGestureRecognizerStateChanged:{
CGFloat rotationStrength = MIN(xDistance / 320, 1);
CGFloat rotationAngel = (CGFloat) (2*M_PI/16 * rotationStrength);
CGFloat scaleStrength = 1 - fabsf(rotationStrength) / 4;
CGFloat scale = MAX(scaleStrength, 0.93);
CGAffineTransform transform = CGAffineTransformMakeRotation(rotationAngel);
CGAffineTransform scaleTransform = CGAffineTransformScale(transform, scale, scale);
self.transform = scaleTransform;
self.center = CGPointMake(self.originalPoint.x + xDistance, self.originalPoint.y + yDistance);
[self updateOverlay:xDistance];
break;
};
case UIGestureRecognizerStateEnded: {
[self resetViewPositionAndTransformations];
break;
};
case UIGestureRecognizerStatePossible:break;
case UIGestureRecognizerStateCancelled:break;
case UIGestureRecognizerStateFailed:break;
}
}
我当前调用方法的方式是这样的,但我觉得像alloc,init一个新的控制器不正确,因为这是视图控制器中的一个视图:
这是我在GGDraggableView.m文件中的尝试:
RandomViewController *rVC = [[RandomViewController alloc]init];
[rVC displayNewInfo];
答案 0 :(得分:1)
道歉我对上一次回复犯了大错。
您要在此处使用的是委托,以便更新您的ViewController。
<强> GCDraggableView.h 强>
@protocol GCDraggableViewDelegate <NSObject>
-(void)GCDraggableView:(id)draggableView dragged:(UIPanGestureRecognizer*) gestureRecognizer;
@end
@interface GGDraggableView ()
@property (weak) id<GCDraggableViewDelegate> delegate;
@end
<强> GCDraggableView.m 强>
- (void)dragged:(UIPanGestureRecognizer *)gestureRecognizer
{
//Call protocol method on delegate in order to update ViewController
[self.delegate GCDraggableView:self dragged:gestureRecognizer];
}
<强> ViewController.m 强>
-(void)viewDidLoad
{
GCDraggableView *subview.delegate = self;
}
-(void)GCDraggableView:(id)draggableView dragged:(UIPanGestureRecognizer*) gestureRecognizer
{
//Whatever you want done when your subview is panned
}
答案 1 :(得分:0)
您无法在视图内使用viewcontroller的属性。因此,如果要将图像添加到imageview中,则应在GGDraggableView
内为该imageview创建memebr变量。将此GGDraggableView
添加到viewDidLoad中的viewcontroller.view或通过XIB / storyboard。现在将图像分配给imageView,方法如gdraggbleview.imageview.image = pics[0];