UIGestureRecognizer в объекте UIView - PullRequest
4 голосов
/ 29 июня 2011

Я создал UIViewController, который содержит UIView объект.

Я хочу, чтобы объект UIView реагировал на одно нажатие одним пальцем, а также на 2 пальца.

Я щелкнул «Взаимодействие с пользователем включено» и «Многократное касание» в xib.

Я создаю UITapGestureRecognizer и UIPinchGestureRecognizer внутри функции UIView initWithFrame: , поскольку это единственная точка входа для объекта UIView. Но объект не реагирует на объекты UIGestureRecognizer. Зачем? Или где лучше всего разместить UIGestureRecognizer объекты?

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        // single tap
        UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];

        singleTap.numberOfTapsRequired = 1;
        singleTap.numberOfTouchesRequired = 1;
        [self addGestureRecognizer: singleTap];

        // 2 fingers pinch
        UIPinchGestureRecognizer* doubleMove = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleMove:)];

        [self addGestureRecognizer: doubleMove];
    }
    return self;
}

Ответы [ 4 ]

4 голосов
/ 29 июня 2011

Ваша проблема в том, что когда вы создаете экземпляр своего подкласса пользовательского представления в IB, вызывается initWithCoder:. Если бы вы сделали это программно, используя initWithFrame:, это работало бы правильно.

Два способа исправить это,

  1. Переместите настройку жестов в другой метод и вызовите их как initWithFrame:, так и initWithCoder:. Я бы порекомендовал сделать это, если вы собираетесь повторно использовать этот компонент и выставлять какие-то обратные вызовы для жестов.

  2. Если вы хотите реализовать это один раз и много взаимодействовать с элементом контроллера, добавьте их в viewDidLoad.

3 голосов
/ 29 июня 2011

Я попробовал твой код, и он работает для меня.

Где вы устанавливаете вид? Может быть, у него есть какой-то другой вид спереди, или у его суперпредставления userInteractionEnabled отключено.

Я создал подкласс UIView и добавил этот код:

-(void) handleSingleTap:(UITapGestureRecognizer *)gr {
    NSLog(@"handleSingleTap");
}

-(void) handleDoubleMove:(UIPinchGestureRecognizer *)gr {
    NSLog(@"handleDoubleMove");
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        // single tap
        UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];

        singleTap.numberOfTapsRequired = 1;
        singleTap.numberOfTouchesRequired = 1;
        [self addGestureRecognizer: singleTap];

        // 2 fingers pinch
        UIPinchGestureRecognizer* doubleMove = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleMove:)];

        [self addGestureRecognizer: doubleMove];
    }
    return self;
}

Тогда в моем контроллере:

-(void) viewDidLoad {
    [super viewDidLoad];

    MyView * myView = [[MyView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    myView.backgroundColor = [UIColor greenColor];
    [self.view addSubview:myView];
    [myView release];

}

И это работает.

1 голос
/ 04 сентября 2013

Я думаю, что если вы работаете с .xib, инициализация также может быть сделана в

- (Недействительными) awakeFormNib;

0 голосов
/ 29 июня 2011

Добавление GestureRecognizers обычно выполняется методом viewDidLoad из UIViewController.

...