Какой подход/управление IOS для перетаскивания точки встречи двух UIView? (пример макета включен)

Вопрос

Какой подход IOS рекомендуется (или есть ли для этого элемент управления IOS, о котором я не знаю), позволяющий пользователю перетаскивать косу между двумя UIView вверх и вниз?

Скажем, есть вид A в верхней части экрана и вид B внизу (внутри представления контейнера), а затем возможность разрешить пользователю перетаскивать точку разделения горизонта вверх или вниз. (поэтому я не говорю здесь о контроллере разделенного представления iPad / IOS, просто чтобы быть ясным, или о новом разделенном представлении приложения в IOS9)

Аспекты интересующего вопроса

  1. Существует ли элемент управления IOS, который может это сделать?
  2. Есть ли известная библиотека, которую люди используют для этого?
  3. Is the concept (if doing it yourself) to perhaps do this:
    • setup autolayout constraints for all the views within the container view (see below)
    • установить ограничение захватаHandle на заданное расстояние от вершины
    • установите вид сверху так, чтобы его нижняя часть зависела от того, где находится GrabHandle, и то же самое для верхней части нижнего вида
    • добавьте жестHandler в graphHandler, а затем, когда он перемещается, каким-то образом передайте местоположение обратно в представление контейнера пользовательского интерфейса, где...
    • он корректирует новую позицию, изменяя «grabHandleDistanceFromTheTopConstraint»?

Это способ попытаться реализовать это сейчас с автомакетом и всем остальным?

введите здесь описание изображения


person Greg    schedule 25.10.2015    source источник


Ответы (1)


На самом деле я думаю, что это может быть (кажется, работает нормально) - какие-либо советы/комментарии?

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var dragHandle: UIView!
    @IBOutlet weak var dragHandleTopConstaint: NSLayoutConstraint!

    var lastLocation:CGPoint = CGPointMake(0, 0)

    override func viewDidLoad() {
        super.viewDidLoad()

        // Allow dragging
        let pan = UIPanGestureRecognizer(target:self, action:"pan:")
        pan.maximumNumberOfTouches = 1
        pan.minimumNumberOfTouches = 1
        self.dragHandle.addGestureRecognizer(pan)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    func pan(rec:UIPanGestureRecognizer) {
        switch rec.state {
        case .Began:
            self.lastLocation = self.dragHandle.center
        case .Changed:
            let translation  = rec.translationInView(self.dragHandle)
            let newLocation : CGPoint = CGPointMake(lastLocation.x, lastLocation.y + translation.y)

            self.dragHandleTopConstaint.constant = newLocation.y
        default:
            ()
        }
    }

}

введите здесь описание изображения

person Greg    schedule 25.10.2015
comment
Ваш код выглядит нормально. Вы можете полностью избавиться от lastLocation. Вместо этого измените константу ограничения на pan.translationInView(dragHandle).y, а затем сбросьте перевод на ноль с помощью pan.setTranslation(CGPointZero, inView:dragHandle). - person rob mayoff; 25.10.2015