Лучший способ сделать это - не использовать 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)))
}