2016-01-11 2 views
1

У меня есть горизонтальный вид прокрутки с 3 видами. Первый вид (крайний левый) - это вид карты. Функциональность, которую я хочу, заключается в том, что пользователь может перейти только ко второму виду, прокручивая с крайнего правого края, потому что я хочу, чтобы другие жесты манипулировали картой. Но со второго и третьего взглядов они могут перемещаться влево или вправо, прокручивая в любом месте обзора. Я искал, как это сделать, и мне не повезло с моей конкретной ситуацией.UIScreenEdgePanGestureRecognizer внутри UIScrollView

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

До сих пор я пытался:

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

let edgeRecognizer = UIScreenEdgePanGestureRecognizer(target: firstView, action: "goToSecondView:") 
    edgeRecognizer.edges = .Right 

func goToSecondView(){ 
    scrollView.contentOffset = CGPoint(x: self.scrollView.contentSize.width/3, y: scrollView.contentOffset.y) 
} 
+1

Вопрос немного расплывчатый. Вы отметили теги [tag: swift] и [tag: object-c], на каком языке реализован ваш режим прокрутки. Также, пожалуйста, покажите нам, что вы пробовали, и где вы застряли. – Cristik

+0

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

+0

У вас есть 3 вида по горизонтали или по вертикали? @EthanSchatzline –

ответ

1

Вместо использования UIScreenEdgePanGestureRecognizer, давайте просто сделать вид карты не видеть штрихи близко на правый край экрана. Таким образом, штрихи пройдут до проспекта прокрутки UIPanGestureRecognizer.

Вот мои настройки:

storyboard layout

(Примечание: просмотр кадры в картине сделать не матча ограничений.)

У меня есть мнение прокрутки, содержащее три вида «страница» , Страница 1 («MapHolder») содержит представление карты как подпункт. Page 2 («Розовый») и стр. 3 («Зеленый») просто имеют надписи на этикетках и имеют фоновый цвет, чтобы их было легко увидеть.

Вид размеры ограничены следующим образом:

  • Страница 2 и 3 ограничены, чтобы иметь такую ​​же ширину и высоту, что и корневое зрение (который является SuperView той точки зрения прокрутки). Это означает, что каждый из них заполнит экран.
  • Page 1 («MapHolder») имеет ту же высоту, что и корневой вид, но ограничивается шириной корневого представления минус 44.
  • Вид карты ограничен одинаковым верхним, нижним и передним краями в качестве родительского элемента, но иметь ту же ширину, что и корневой вид.

Обратите внимание на то, что вид карты шире его родительского (стр. 1). В режиме просмотра страницы 1 отключено «Захват клипа» (это значение по умолчанию), поэтому часть карты, которая выходит за пределы просмотра страницы 1, по-прежнему будет видна, но не получит штрихов.

Позиции вид ограничена следующим образом:

  • Вид прокрутка имеет ограничение на все четыре краев к корневому зрению. Это означает, что прокрутка будет заполнять экран.
  • Page 1 имеет ограничения от верхнего, нижнего и переднего краев к виду прокрутки.
  • Передняя кромка 2-го листа ограничена задней кромкой страницы 1 и 44.
  • Page 3 Передняя кромка 3 Page 3 ограничивается равным заднему краю страницы 2.
  • Задний край 3-го лица ограничен равным заднему краю прокрутки.
  • Вертикальные центры страниц 1, 2 и 3 ограничены равными.

Ограничения на просмотр страниц в режиме прокрутки контролируют просмотр прокрутки contentSize.

Наконец, я включил «Пейджинг включен» для просмотра прокрутки. Результат:

demo

Я загрузил свой раскадровки to this gist. Просто добавьте его в новый проект (заменив существующую Main.storyboard) и связавшись с MapKit, чтобы попробовать.

+0

1 за то, что вы так описательны. Собираюсь попробовать и сообщить, как это происходит. –

+0

Я в настоящее время пытаюсь это сделать, и я получаю карту с 44 точками пробела справа. Обрезание отключено на экране mapView. У меня нет моей раскадровки, как у вас, у меня есть View Scroll View Controller, а затем 3 других контроллера просмотра в моей раскадровке, где я помещаю их представления в вид прокрутки. Поэтому я не уверен, как делать ограничения, как вы сказали, и я предполагаю, что это не так, как у вас. Я установил mapView.view.frame = rootView с -44 в ширину и mapView.MKView's frame.width = ширина rootView. –

+0

Я достиг этого, перейдя в MapViewController в раскадровку и просто ограничив ширину MKView шириной mapView + 44. –

0

Очень просто просто поставить эту функцию делегата на вашем UIScreenEdgePanGestureRecognizer и установить UIGestureRecognizerDelegate

Работа с Xcode 8 и Swift 3 :)

Вам нужно это 3 функции делегата.

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return false 
} 

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive press: UIPress) -> Bool { 
    return false 

} 

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { 
    return true 
} 
Смежные вопросы