Два представления в UIViewController и промежуточный sizer - iPad - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь использовать viewController с двумя UIView s бок о бок для экранов iPad. Левое представление будет иметь табличное представление, в то время как правое представление будет содержимым выбранной ячейки табличного представления. Аналогично почтовому приложению iPad (которое использует UISplitViewController), но в портретной ориентации левый вид (вид таблицы) должен оставаться там и не уходить (UISplitViewController заставляет его исчезнуть).

Мне удалось заставить это работать, просто используя ограничения, но в дополнение к видам из стороны в сторону, мне нужна вертикальная полоса между видами, где я могу сдвинуть виды в любую сторону, чтобы увидеть больше слева или правильный вид. Эта панель аналогична панели в приложении Notable при просмотре двух заметок вместе (см. Прикрепленный скриншот). Когда я пытался заставить планку двигаться, ограничения не позволяли этому случиться. Каков наилучший способ сделать это?

Notability Screenshot

1 Ответ

0 голосов
/ 13 января 2019

Лучший способ сделать это - не использовать UISplitViewController. Вместо этого просто используйте полноэкранный UIViewController в качестве контейнера, добавьте два представления контейнера, разделенных внутри bar, добавьте в него свой контроллер табличного представления и контроллер деталей в качестве дочерних контроллеров представления.

Вы можете выровнять bar по горизонтали к белому superview.center.x (назовем это ограничение barAlignToSuperviewCenterConstraint), вы можете легко переместить его, изменив константу ограничения на смещение от центра.

Для этого

  • присоединить UIPanGestureRecognizer к суперпредставлению панели, которое также является суперпредставлением для панелей (назовем его barDragRecognizer).
  • в обратном вызове распознавателя, когда распознаватель панорамирования находится в состоянии .began, установите для его перевода текущее значение barAlignToSuperviewCenterConstraint.constant:

    barDragRecognizer.setTranslation(CGPoint(x: barAlignToSuperviewCenterConstraint.constant, y: 0) in: bar.superview)
    
  • в обратном вызове распознавателя, когда распознаватель панорамирования находится в одном из состояний .changed, .ended, .cancelled, установить значение константы ограничения равным значению перевода распознавателя:

    barAlignToSuperviewCenterConstraint.constant = barDragRecognizer.translation(in: bar.superview).x;
    

Чтобы ваш распознаватель получал касания только с панели, назначьте контроллер вида в качестве делегата распознавателя и выполните следующее:

func gestureRecognizer(UIGestureRecognizer recognizer, shouldReceive: UITouch touch) -> Bool {
    let barExtendedBounds = bar.bounds.insetBy(dx: -20, dy: 0)
    return (recognizer == barDragRecognizer && barExtendedBounds.constains(touch.location(in: bar)))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...