Невозможно использовать UIPanGestureRecognizer для перемещения UIImageView - PullRequest
4 голосов
/ 23 декабря 2010

Я пытаюсь создать программу, в которой пользователь может перетаскивать UIImageView по экрану с помощью UIPanGestureRecognizer. Я пробовал несколько разных способов, но не могу понять это. Я не уверен, что мне нужно создать отправителя / запросчика. Насколько я понимаю, UIImageView необходимо поместить в UIView, который может обрабатывать жесты. В моей программе у меня есть контроллер представления - AdvancedViewController1. Я создал UIView с именем AdvancedView1. В Интерфейсном Разработчике я вставил 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 голосов
/ 23 декабря 2010

Вы должны фактически установить положение UIView в вашем селекторе pan:.И поскольку вы делаете это в своем классе 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] при запуске просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...