Подтвердить что ты не робот

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

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

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

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

enter image description here

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

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

Code example

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

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

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

4b9b3361

Ответ 1

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

  • Я сделал то же самое, что и вы, используя 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.

Ответ 2

Я пробовал его в 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

Ответ 3

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

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

https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIScreenEdgePanGestureRecognizer_class/index.html

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

Ответ 4

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

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

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

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

Ответ 5

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)")
}

Ответ 6

Кажется, что есть ошибка в построителе интерфейса Xcode 6.4s и Swift. Кроме того, ответ Томаса LIUs также был правильным: кажется, необходимо установить свойство .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")
}

Ответ 7

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