Как настроить UIScreenEdgePanGestureRecognizer с помощью Interface Builder?

17

Я не могу заставить UIScreenEdgePanGestureRecognizer работать, когда создаю, когда добавляю его в свой контроллер представлений с помощью Interface Builder, поэтому я прошу здесь установить, что я делаю что-то неправильно или если есть ошибка в Xcode.

Вот шаги для воспроизведения:

  • Создайте новый проект Xcode, используя шаблон «Single View Application» для iOS.
  • Добавьте UIView в главный контроллер представления, перетащив его из библиотеки объектов в построителе интерфейсов
  • Добавить UIScreenEdgePanGestureRecognizer в представление, перетащив его из библиотеки объектов в построителе интерфейсов
  • Убедитесь, что распознаватель жестов включен и выбран край:

  • Откройте редактор помощников для класса ViewController и ctrl-drag из блока реализации UIScreenEdgePanGestureRecognizer в ViewController , чтобы создать новый IBAction 'Добавьте точку останова в тело метода действия, чтобы проверить, распознается ли жест ленты рамки

Полученный код выглядит следующим образом:

Если я запустил приложение на своем устройстве (iPhone 6 с iOS 8.02), точка останова не пострадает, когда я нажимаю край.

Есть ли что-то, что мне не хватает?

UPDATE: это было зарегистрировано как ошибка с Apple (rdar: // 18582306) 08-Oct-2014 и все еще не разрешено в Xcode 6.4 (6E35b)

    
задан Jamie Bullock 08.10.2014 в 14:32
источник

7 ответов

22

Я создал проект для проверки вашего вопроса и нашел ту же проблему, что и вы. Вот сценарии, которые я настроил для тестирования:

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

    -(void)handlePan:(id)sender
    {
        NSString *test = @"";
    }
    
  • Затем я создал дополнительный жест, используя жест щепотки в том же представлении с помощью Interface Builder, и я смог заставить отладчик остановиться в этом селекторе. Так что Interface Builder, похоже, правильно строит другие жесты.

  • Затем я создавал жест края экрана вручную, используя следующий код, и он работал, как ожидалось.

В файле ViewController.h я включил UIGestureRecognizerDelegate.

@interface ViewController : UIViewController <UIGestureRecognizerDelegate>
@end

В файле ViewController.m я выполнил этот жест вручную.

#import "ViewController.h"

@interface ViewController ()

-(void)handlePan:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad 
{
    [super viewDidLoad];
    UIScreenEdgePanGestureRecognizer *pan = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self
                                                                                              action:@selector(handlePan:)];
    [pan setEdges:UIRectEdgeLeft];
    [pan setDelegate:self];
    [self.view addGestureRecognizer:pan];
}

-(void)handlePan:(id)sender
{
    NSString *test = @"";
}

@end

Я закончил с тем же самым заключением, что и вы - что-то не так с реализацией интерфейса Builder UIScreenEdgePanGestureRecognizer.

    
ответ дан sunergeos 08.10.2014 в 17:31
источник
6

Я пробовал его в Xcode 7.0 Beta 4 (7A165t), и это все еще ошибка. Добавление признака распознавания жгута экрана с помощью интерфейса Builder не вызывает ссылку IBAction, но добавляет ее программно, как это прекрасно работает:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let edgeGestureRecognizer = UIScreenEdgePanGestureRecognizer(target: self, action: "userSwipedFromEdge:")
        edgeGestureRecognizer.edges = UIRectEdge.Left
        edgeGestureRecognizer.delegate = self
        self.view.addGestureRecognizer(edgeGestureRecognizer)
    }

    func userSwipedFromEdge(sender: UIScreenEdgePanGestureRecognizer) {
        if sender.edges == UIRectEdge.Left {
            print("It works!")
        }
    }
}

Совет: Не забудьте добавить в свой класс протокол UIGestureRecognizerDelegate . В противном случае вы получите сообщение об ошибке edgeGestureRecognizer.delegate = self

    
ответ дан Peter 12.08.2015 в 13:19
источник
5

Это можно рассматривать как ошибку, но на самом деле, вот что-то полезное:

"После создания распознавателя жестов в рамке экрана назначьте соответствующее значение свойства edge перед прикреплением распознавателя жестов к вашему представлению."

Ссылка

Это требование применимо только к UIScreenEdgePanGestureRecognizer, поэтому я считаю, что именно поэтому Xcode делает это неправильно, он должен быть реализован как нормальная последовательность, alloc- & gt; init- & gt; attach- & gt; установленное значение. Он будет работать для всех других GestureRecongnizer, но не UIScreenEdgePanGestureRecognizer.

    
ответ дан Thomas LIU 07.04.2015 в 09:06
источник
2

Чтобы убедиться, что несколько распознавателей жестов могут работать вместе, вы должны реализовать метод shouldRecognizeSimultaneouslyWithGestureRecognizer и вернуть true:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

Извините за код Swift, но вы должны получить эту идею.

Этот метод должен быть реализован, даже если вы используете один распознаватель жестов, поскольку представление может иметь свои собственные (системные) распознаватели, такие как MKMapView .

    
ответ дан zisoft 08.10.2014 в 15:10
источник
2

Xcode не всегда хороший сосед. К сожалению.

override func viewDidLoad() {
    super.viewDidLoad()

    let panGesture = UIScreenEdgePanGestureRecognizer(target: self, action: "panAction:")
    panGesture.edges = .Left
    view.addGestureRecognizer(panGesture)
}


func panAction(sender: UIScreenEdgePanGestureRecognizer) {
    let translation = sender.translationInView(sender.view!)

    println("Trans:\(translation)")
}
    
ответ дан Zelko 19.02.2015 в 07:27
источник
2

Кажется, что есть ошибка в построителе интерфейса Xcode 6.4 и Swift. Кроме того, ответ Томаса LIU был также правильным: кажется, необходимо установить свойство .edge в коде, а не в Interface Builder.

Несмотря на то, что в IB есть флажки edge, они, похоже, игнорируются.

Я решил это так: Ctrl-drag от распознавателя жестов к классу viewController для создания IBOutlet:

class ViewController: UIViewController {
    @IBOutlet var leftEdgeGestureRecognizer: UIScreenEdgePanGestureRecognizer!

, то в viewDidLoad:

leftEdgeGestureRecognizer.edges = .Left

и, наконец, ctrl-drag из распознавателя, чтобы создать IBAction

@IBAction func swipeFromLeft(sender: AnyObject) {
        print("===> Swipe from left edge.\n")
}
    
ответ дан drtofu 08.09.2015 в 08:22
источник
1

Одинаковая проблема с длинной. Его ошибка xcode, ее лучше добавить программно.

    
ответ дан itsji10dra 19.02.2015 в 08:09
источник