Кадр UIView не отображается обновленным с помощью UIPanGestureRecognizer

У меня есть подвид в viewController, к которому я добавил UIPanGestureRecognizer. Я хотел бы расширить такое подвид, когда пользователь перетаскивает его вниз, поэтому я пытаюсь обработать статус распознавателя жестов следующим образом:

@objc func panning(_ gestureRecognizer: UIPanGestureRecognizer) {
    let translation = gestureRecognizer.translation(in: view)

    if gestureRecognizer.state == .began {
        originalFrame = self.mySubview.frame
    } else if gestureRecognizer.state == .changed {
        if translation.y > 0 {
            var newFrame = originalFrame
            newFrame.size.height += translation.y
            mySubview.frame = newFrame
        }
    }
}

когда я устанавливаю точку останова на mySubview.frame = newFrame, я вижу, что newFrame обновляется с переводом. Однако я не вижу смены кадров на экране, подвид всегда выглядит как в начале.

Что я мог упустить?


person AppsDev    schedule 23.08.2017    source источник


Ответы (2)


PanGesture штука хитрая, но работать с ней очень интересно...

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

  func handlePanGesture(_ gesture: UIPanGestureRecognizer) {
    var translatedPoint: CGPoint = gesture.translation(in: self.superview)

    let playerCenterX: CGFloat = (gesture.view?.center.x)! + translatedPoint.x
    let playerCenterY: CGFloat = (gesture.view?.center.y)! + translatedPoint.y

    translatedPoint = CGPoint.init(x: playerCenterX,
                                   y: playerCenterY)

    gesture.view?.center = translatedPoint
    gesture.setTranslation(CGPoint.zero, in: self.superview)

}

Важно то, что вы устанавливаете его перевод на ноль каждый раз в конце движения жеста.

В соответствии с вашими требованиями измените это self.superview и используйте координаты для обновления рамки обзора...

person Abdul Yasin    schedule 23.08.2017

Если рамка вашего представления установлена ​​автомакетом, вы должны обновить ограничения, а не саму рамку представления.

person Adam Różyński    schedule 23.08.2017