2013-07-24 3 views
4

Сейчас я использую класс SWRevealViewController в своем проекте. Базовая функциональность позволяет мне переключать вид спереди, нажимая кнопку навигационной панели. Но я хочу добавить жест ко всему виду.SWRevealViewController добавляет жест во весь вид спереди

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

[self.startTestButton addGestureRecognizer:self.revealViewController.panGestureRecognizer]; 

Но он просто работает для одного элемента пользовательского интерфейса. Поэтому я не могу добавить, например, другой элемент пользовательского интерфейса к этому жесту.

Этот код ниже показывает, как было написано метод panGestureRecognizer:

- (UIPanGestureRecognizer*)panGestureRecognizer 
{ 
    if (_panGestureRecognizer == nil) 
    { 
     SWDirectionPanGestureRecognizer *customRecognizer = 
      [[SWDirectionPanGestureRecognizer alloc] initWithTarget:self action:@selector(_handleRevealGesture:)]; 

     customRecognizer.direction = SWDirectionPanGestureRecognizerHorizontal; 
     customRecognizer.delegate = self; 
     _panGestureRecognizer = customRecognizer ; 
    } 
    return _panGestureRecognizer; 
} 
+0

Обязательным условием является то, что любой контроллер просмотра для реализации прокрутки для обнаружения активности должен быть каким-то образом связан с RevealViewController в раскадровке. У меня проблема с этим? –

ответ

9

Чтобы добавить жест распознаватель на весь взгляд просто добавить его в целом зрения, а не только одной кнопки. Я использую SWRevealViewController и мой основной вид является UITableView так, чтобы жест распознаватель работать на весь взгляд у меня есть это в viewDidLoad метод моего UIViewController:

[self.tableView addGestureRecognizer: self.revealViewController.panGestureRecognizer];

Так, просто добавьте распознаватель на вид, который вам нравится. Для большинства UIViewContoller s это будет self.view.

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

+1

да это работа в видеDidLoad. Я пропустил одно. [self.navigationController.navigationBar addGestureRecognizer: opensController.panGestureRecognizer] строка идет после self.view addGestureRecognizer: self.revealViewController.panGestureRecognizer] line и была перезапись. Могу ли я также добавить жест к кнопке панели навигации и к виду? –

+0

Могу ли я добавить прикосновение внутрь жест к моему мнению? или уже сделан метод в коде. Я имею в виду, когда вид спереди переключился влево. –

+1

@MatrosovAlexander, почему вы хотите распознать жестов на кнопке навигационной панели? Если вы добавите его в навигационную панель, тогда вся навигационная панель получит распознаватель жестов. Обычно вы хотите, чтобы кнопка просто переключила вид спереди влево. У вас может быть метод действий для вашей кнопки, который: '[self.revealViewController opensToggle: sender];' который будет переключать вид спереди в сторону, а затем обратно. – mluisbrown

1

Если вы используете контроллер навигации и пытаетесь добавить распознаватель жестов в self.view, этот жест не будет реагировать при прокрутке на панели навигации. То, что я сделал, это перейти в классы SWReaveal и добавить второй распознаватель жестов. Поэтому теперь я добавляю один распознаватель в self.view и один в панель навигации. Работает отлично. Я могу использовать код, если вам это нужно, но он не должен быть слишком сложным.

+0

, хотя это работает, я считаю, что лучшим решением является добавление оригинального распознавателя жестов в self.navigationController.view вместо self.view – MobileMon

2

// UPD:
Похоже, что мое предыдущее решение является излишним, вы можете просто вызвать getter, чтобы получить поведение по умолчанию. То есть

[revealViewController panGestureRecognizer]; 

// старое решение
Можно также добавить SWRevealViewController «s panGestureRecognizer к его собственной точки зрения, например, в подклассе SWRevealViewController вы можете иметь:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // adds gesture recognizer to the whole thing 
    [self.view addGestureRecognizer:self.panGestureRecognizer]; 
} 
0

Если вы используете навигацию контроллер для вашего вида спереди вы можете добавить жест панорамы к виду навигационного контроллера, подобному этому

[self.navigationController.view addGestureRecognizer: self.revealViewControll er.panGestureRecognizer];

Таким образом, вы также можете прокручивать навигационную панель без изменения каких-либо классов контроллера SWReveal.

1

Чтобы добавить Жест на весь вид спереди, используя SWRevealViewController с помощью раскадровки, мы должны добавить

SWRevealViewController *revealController = [self revealViewController]; 
[revealController panGestureRecognizer]; 
[revealController tapGestureRecognizer]; 

в FirstViewController в приложения.Добавить действие и цель на кнопку навигационной панели, как

_sidebarButton.target = self.revealViewController; 
_sidebarButton.action = @selector(revealToggle:); 

// Set the gesture 
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; 

В SWRevealViewController.h добавить следующий метод как

- (UITapGestureRecognizer*)tapGestureRecognizer; 
- (BOOL)revealControllerTapGestureShouldBegin:(SWRevealViewController *)revealController; 

В SWRevealViewController.m добавить

- (UITapGestureRecognizer*)tapGestureRecognizer 
{ 
if (_tapGestureRecognizer == nil) 
{ 
    UITapGestureRecognizer *tapRecognizer = 
    [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleTapGesture:)]; 

    tapRecognizer.delegate = self; 
    [_contentView.frontView addGestureRecognizer:tapRecognizer]; 
    _tapGestureRecognizer = tapRecognizer ; 
} 
return _tapGestureRecognizer; 

}

- (void)_handleTapGesture:(UITapGestureRecognizer *)recognizer 

{

NSTimeInterval duration = _toggleAnimationDuration; 
[self _setFrontViewPosition:FrontViewPositionLeft withDuration:duration]; 

}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
if (_animationQueue.count == 0) 
{ 
    if (gestureRecognizer == _panGestureRecognizer) 
     // return [self _panGestureShouldBegin]; 
     return (gestureRecognizer == _panGestureRecognizer && _animationQueue.count == 0) ; 

    if (gestureRecognizer == _tapGestureRecognizer) 
     return [self _tapGestureShouldBegin]; 
} 

return NO; 

}

В случае XIb вы можете направить использование

https://github.com/John-Lluch/SWRevealViewController

1

На Swift

self.revealViewController().frontViewController.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer()) 
Смежные вопросы