2015-05-03 2 views
4

Я бы хотел включить UIPanGestureRecognizer на customView, когда customView сделал longPress.
(я хочу, когда вы longPresscustomView, то customView перейдет в «режим перемещения», и вы можете перемещать customView путем перетаскивания.)Включить UIPanGestureRecognizer, когда longPress

Но в этом коде, только longPressAction: называется. panAction: не звонил.
Как исправить это, чтобы включить PanAction:?

- (void)viewDidLoad 
{ 
    [self.view addSubview:customView]; 

    UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction:)]; 
    [customView addGestureRecognizer:longPressRecognizer]; 
    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)]; 
    [customView addGestureRecognizer:panRecognizer]; 
} 

- (void)longPressAction:(UILongPressGestureRecognizer *)recognizer 
{ 
    if ([recognizer state] == UIGestureRecognizerStateBegan) { 
     CustomView *customView = (CustomView *)recognizer.view; 
     customView.panRecongnizerEnabled = YES; //panRecongnizerEnabled is CustomView's property 
    } 
    if ([recognizer state] == UIGestureRecognizerStateEnded) { 
     CustomView *customView = (CustomView *)recognizer.view; 
     customView.panRecongnizerEnabled = NO; 
    } 
} 

- (void)panAction:(UIPanGestureRecognizer *)recognizer 
{ 
    CustomView *customView = (CustomView *)recognizer.view; 
    if (customCell.panRecongnizerEnabled == NO) return; 
    NSLog(@"running panAction"); 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 
+0

Честно говоря, это звучит так, будто вы должны слушать прикосновения. Затронутые/прикосновенияМонированные/прикосновения. На самом UIView после longPress вы можете просто установить заблокированные границы и соответствующим образом переместить вид. – TheCodingArt

ответ

2

Ваш ViewController должен соответствовать UIGestureRecognizerDelegate. Я подозреваю, что вы либо уже сделали это , либо, иначе shouldRecognizeSimultaneouslyWithGestureRecognizer не имеет никакого смысла. Но то, что вы определенно хватает установки на gestureRecognizer в делегат вашего ViewController:

longPressRecognizer.delegate = self; 
panRecognizer.delegate = self; 

Теперь вы должны получать как длительное нажатие и панорамирование одновременно.

Примечание: Я протестировал без какого-либо customView, просто добавил их в self.view. По крайней мере, в этом случае приведенный выше код работал так, как ожидалось.

+0

Это помогло мне понять, почему shouldRecognizeSimultaneousWithGestureRecognizer и gestureRecognizerShouldBegin не стреляли. Благодаря! – duyn9uyen

0

Я знаю, что этот вопрос был закрыт на некоторое время, но я недавно должен был сделать что-то подобное, и есть гораздо более чистое решение. UILongPressGestureRecognizer - это все, что вам нужно для этого.

Жесты непрерывной печати непрерывны. начинается жест (UIGestureRecognizerStateBegan), когда число допустимых пальцев (numberOfTouchesRequired) была нажата в течение заданного периода (minimumPressDuration) и штрихи не выйти за пределы допустимого диапазона движения (allowableMovement) . Жест распознаватель переходит в состояние изменения всякий раз, когда движется палец, и заканчивается (UIGestureRecognizerStateEnded), когда любой из пальцев снят.

Из-за этого для того, что вам нужно, нет необходимости в UIPanGestureRecognizer. Просто добавьте UILongPressGestureRecognizer и прикрепите его к основному виду.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UILongPressGestureRecognizer *longPressRecognizer = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction:)]; 
    // set this to your desired delay before the pan action will start. 
    longPressRecognizer.minimumPressDuration = 0.5; 
    [self.view addGestureRecognizer:longPressRecognizer]; 
} 

Затем реализовать метод longPressAction смотреть не только UIGestureRecognizerStateBegan или UIGestureRecognizerStateEnded состояний, но и UIGestureRecognizerStateChanged состояние:

- (void)longPressAction:(UIGestureRecognizer *)recognizer 
{ 
    if ([recognizer state] == UIGestureRecognizerStateBegan || [recognizer state] == UIGestureRecognizerStateChanged) { 
     CGPoint touchPoint = [recognizer locationInView:self.view]; 
     [self.viewToMove setCenter: touchPoint]; 
     NSLog(@"running panAction"); 
    } 
} 

В моем примере, я просто переместить фиктивный вид для отслеживания центр пальца пользователя, но вы можете поместить любую логику, которую вы бы положили в код UIPanGestureRecognizer. Просто поставьте его внутри блока if, и это значительно упростит ваш код, и вам не нужно иметь дело с взаимодействиями между двумя распознавателями жестов. Ваш код также приведет к многочисленным ненужным вызовам метода panAction, когда пользователь просто перемещает палец по экрану (но не сделал длительного нажатия).