Iphone 无法使用UIPangestureRecognitor移动UIImageView

Iphone 无法使用UIPangestureRecognitor移动UIImageView,iphone,ipad,uigesturerecognizer,Iphone,Ipad,Uigesturerecognizer,我正在尝试创建一个程序,用户可以使用UIPangestureRecognitor在屏幕上拖动UIImageView。我试过几种不同的方法,但都不明白。我不确定是否需要创建发送者/请求者。我的理解是UIImageView需要放在一个可以处理手势的UIView中。在我的程序中,我有一个视图控制器-AdvancedViewController1。我已经创建了一个名为AdvancedView1的UIView。在interface Builder中,我已将AdvancedView1插入AdvancedVi

我正在尝试创建一个程序,用户可以使用UIPangestureRecognitor在屏幕上拖动UIImageView。我试过几种不同的方法,但都不明白。我不确定是否需要创建发送者/请求者。我的理解是UIImageView需要放在一个可以处理手势的UIView中。在我的程序中,我有一个视图控制器-AdvancedViewController1。我已经创建了一个名为AdvancedView1的UIView。在interface Builder中,我已将AdvancedView1插入AdvancedViewController 1。以下是控制器和视图的my
.h
.m
文件。我只包含了相关代码。请让我知道我是否接近,以及如何修复我的代码。提前感谢你的帮助

AdvancedViewController1.h
#import <UIKit/UIKit.h>
#import "AdvancedView1.h"
@interface AdvancedViewController1 : UIViewController {
UIWindow *window;
AdvancedView1 *advancedView1;
UIImageView * option1; 
}
@property (retain) IBOutlet AdvancedView1 *advancedView1;
@property (retain) IBOutlet UIImageView *option1;
@end
AdvancedViewController1.h
#进口
#导入“AdvancedView1.h”
@接口AdvancedViewController 1:UIViewController{
UIWindow*窗口;
AdvancedView1*AdvancedView1;
UIImageView*选项1;
}
@属性(保留)IBOutlet AdvancedView1*AdvancedView1;
@属性(保留)IBUIImageView*选项1;
@结束
在IB中,我将一个IBOutlet链接到AdvancedView1到UIView,并将option1链接到我希望能够移动的UIImageView

AdvancedViewController.m

#import "AdvancedViewController1.h"
#import "AdvancedView1.h"
@implementation AdvancedViewController1
@synthesize advancedView1;
@synthesize option1

- (void)viewDidLoad { 
UIGestureRecognizer *pangr = [[UIPanGestureRecognizer alloc]       initWithTarget:self.advancedView1 action:@selector(pan:)];
pangr.delegate = self;
[self.advancedView1 addGestureRecognizer:pangr];
[pangr release];      
[super viewDidLoad];
}

AdvancedView1.h

#import <UIKit/UIKit.h>
#import "AdvancedViewController1.h"
@class AdvancedView1;
@interface AdvancedView1 : UIView{
CGPoint* origin;
}
@property (nonatomic)  CGPoint* origin;
@end

AdvancedView1.m
#import "AdvancedView1.h"
#import "AdvancedViewController1.h"
@implementation AdvancedView1;
@synthesize origin;

- (void)pan:(UIPanGestureRecognizer *) gesture
{
if ((gesture.state == UIGestureRecognizerStateChanged) ||
(gesture.state == UIGestureRecognizerStateEnded)) {

CGPoint translation = [gesture translationInView:self];
gesture.origin = CGPointMake(gesture.origin.x+translation.x,        gesture.origin.y+translation.y);
[gesture setTranslation:CGPointZero inView:self];
}
AdvancedViewController.m
#导入“AdvancedViewController1.h”
#导入“AdvancedView1.h”
@实现高级视图控制器1
@综合先进观点1;
@合成选项1
-(void)viewDidLoad{
UIgestureRecognitzer*pangr=[[UIPangestureRecognitzer alloc]initWithTarget:self.advancedView1操作:@selector(pan:)];
pangr.delegate=self;
[self.advancedView1 addgestureRecognitor:pangr];
[pangr释放];
[超级视图下载];
}
高级视图1.h
#进口
#导入“AdvancedViewController1.h”
@类高级视图1;
@界面高级视图1:UIView{
CGPoint*原点;
}
@属性(非原子)CGPoint*原点;
@结束
AdvancedView1.m
#导入“AdvancedView1.h”
#导入“AdvancedViewController1.h”
@实施高级视图1;
@综合起源;
-(无效)平移:(UIPangestureRecognitor*)手势
{
如果((手势.state==UIGestureRecognitizerStateChanged)||
(手势.state==UIGestureRecognitzerStateEnded)){
CGPoint translation=[手势翻译视图:self];
手势.origin=CGPointMake(手势.origin.x+translation.x,手势.origin.y+translation.y);
[手势设置翻译:CGPointZero-inView:self];
}

您必须在pan:selector中实际设置UIView的位置。由于您是在AdvancedView类中而不是在其外部执行此操作,因此必须获取视图的父视图([self superview]),因为更新位置是相对于父(包含)视图的。请尝试以下操作:

- (void)pan:(UIPanGestureRecognizer *)gesture
{
  if ((gesture.state == UIGestureRecognizerStateChanged) ||
      (gesture.state == UIGestureRecognizerStateEnded)) {

    CGPoint location = [gesture locationInView:[self superview]];

    [self setCenter:location];
  }
}

请记住,您需要确保您的子类视图启用用户交互,否则手势识别器将无法工作。只需使用
[self-setUserInteractionEnabled:YES]打开它即可
当您初始化视图时。

感谢您的回复。它越来越近了,但我有几个问题。当触摸UIView时,它现在正在平移,但一旦我结束平移手势,视图就会消失。知道为什么吗?另外,我试图做的是允许UIView中的UIImageView移动,但现在有了这段代码,整个UIView都被移动了移动。这可能吗?或者我需要创建几个UIView并在每个UIView中放置一个图像,以便移动每个图像?添加
[self-setUserInteractionEnabled:YES]
警告太好了。我只是节省了一点时间,我猜