2014-10-08 6 views
17

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

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

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

enter image description here

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

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

Code example

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

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

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

ответ

23

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

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

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

я закончил с тем же вывод вы сделали - там, кажется, что-то не так с реализацией Интерфейс Строителя в UIScreenEdgePanGestureRecognizer.

+1

Хотел добавить, что я тестировал это в симуляторе и на своем устройстве с теми же результатами - без ответа на жест, реализованный IB. – sunergeos

+0

Спасибо, что нашли время, чтобы проверить это. Я теперь подал сообщение об ошибке с Apple: http://openradar.io/18582306 –

+0

Я отметил это как принятый ответ, так как он подтверждает, что я ничего не делаю неправильно, и что Xcode не ведет себя так, как ожидалось. –

2

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

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

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

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

+0

К сожалению, реализация «жестов» Recognizer: shouldRecognizeSimultaneousWithGestureRecognizer: 'делегировать метод и сделать' ViewController' делегатом 'UIScreenEdgePanGestureRecognizer' не имеет никакого значения. Все еще не обнаружено краев. Регулярный 'UIPanGestureRecognizer' работает отлично. Думаю, я могу поднять отчет об ошибке. –

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

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

5

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

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

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

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

6

Я пробовал его в Xcode 7.0 Beta 4 (7A165t), и это все еще ошибка. Добавление края экрана Pan Gesture распознавателя с помощью Interface 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

2

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

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

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

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

затем, в viewDidLoad:

leftEdgeGestureRecognizer.edges = .Left 

и, наконец, Ctrl -расс из распознавателя для создания IBAction

@IBAction func swipeFromLeft(sender: AnyObject) { 
     print("===> Swipe from left edge.\n") 
} 
Смежные вопросы