无法使用UIPanGestureRecognizer移动UIImageView

4
我正在尝试创建一个程序,用户可以使用UIPanGestureRecognizer拖动UIImageView在屏幕上移动。我已经尝试了几种不同的方法,但是无法弄清楚。我不确定是否需要创建发送者/请求者。我的理解是UIImageView需要放置在一个可以处理手势的UIView中。在我的程序中,我有一个视图控制器-AdvancedViewController1。我创建了一个名为AdvancedView1的UIView。在接口构建器中,我将AdvancedView1插入到AdvancedViewController 1中。以下是我的控制器和视图的.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

在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];
}
1个回答

12

在pan:选择器中,您必须实际设置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中,以便我可以移动每个图像? - JulianF
太棒了,加上[self setUserInteractionEnabled:YES]的提示。我猜我刚刚省了一点时间。 - NSTJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接