определять положение центра пользовательского интерфейса в отношении представления контейнера — Swift — программно

#swift #uiview #viewcontroller #uipangesturerecognizer

#swift #пользовательский интерфейс #viewcontroller #распознаватель пользовательского интерфейса

Вопрос:

У меня есть карта пользовательского интерфейса, добавленная поверх представления ViewController:

 self.view.addSubview(cardView)
cardView.anchor(top: self.topWhiteView.bottomAnchor, leading: view.leadingAnchor, bottom: buttonsStackView.topAnchor, trailing: view.trailingAnchor, padding: .init(top: 15, left: 10, bottom: 10, right: 10))
  

Я добавил к нему panGestureRecogniser, с помощью которого я могу перетаскивать карту.
Метод панорамирования:

 @objc func handlePan(gesture : UIPanGestureRecognizer){
    
    
    switch gesture.state {
    case .changed:
        handleChanged(gesture)
    case .ended:
        handleEnded(gesture)
    default:
        ()
    }
    
    
}


fileprivate func handleChanged(_ gesture: UIPanGestureRecognizer) {
    
    
    let translationY = gesture.translation(in: nil).y
    var scaleValue : CGFloat = 1
    let multiplier = 1.1*translationY
    if translationY != 0 {
        scaleValue = 1 - (abs(translationY*multiplier)/abs(translationY)/3000)
    }


    let scale = CGAffineTransform(scaleX: scaleValue, y: scaleValue)

    let translation = gesture.translation(in: nil)
    let rotationRadiant: CGFloat = translation.x / 20
    let rotationDegree = (rotationRadiant * .pi) / 180
    let rotationalTransformation = CGAffineTransform(rotationAngle: rotationDegree)
    self.transform = rotationalTransformation.translatedBy(x: translation.x, y: translation.y).concatenating(scale)
    
    
   }


fileprivate func handleEnded(_ gesture: UIPanGestureRecognizer) {
    
    UIView.animate(withDuration: 0.6, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.1, options: [.curveEaseOut, .allowUserInteraction], animations: {
        
        self.transform = CGAffineTransform.identity
        
    })
}
  

Я хочу знать, как определять центральное положение CardView при каждом перемещении карты.

Но в отличие от других вопросов о переполнении стека, я хотел бы сделать это в классе CardView без использования каких-либо делегатов.

Ответ №1:

Не уверен, что я точно понял ваши потребности, но попробуйте следующее

 class CardView: UIView {
    override var center: CGPoint {
        get { super.center }
        set {
            super.center = newValue
            didMove(to: newValue)
        }
    }

    private func didMove(to point: CGPoint) {
        // do anything needed with new position
    }
}