CGAffineTransform UIView с помощью UIPanGestureRecognizer

У меня есть представление А, добавьте под себя. И я хочу, чтобы, когда я рисую panGestureRegonizer в представлении A, представление A перемещалось вслед за рисованием.

И при перемещении вид A будет масштабироваться. Вид A будет уменьшаться при перемещении вида вверх/влево/вниз/справа экрана и увеличиваться при перемещении вида в центр экрана.

Я пробовал много решений, но я не могу это сделать.

Пожалуйста, предложите мне помочь?


person Thuan Nguyen    schedule 14.11.2017    source источник
comment
так в чем вопрос??   -  person Bilal    schedule 14.11.2017
comment
У меня есть вопрос об обновлении, пожалуйста, проверьте еще раз, помогите мне.   -  person Thuan Nguyen    schedule 14.11.2017


Ответы (1)


Логика: у вас есть система координат (CS) с центром, x и y. Когда пользователь использует жест панорамирования, он/она генерирует последовательность точек в CS. Итак, наша задача — измерить расстояние между центром КС и точками пользователей. Когда у нас есть самое дальнее расстояние, мы можем вычислить масштабный коэффициент для нашего масштабируемого вида.

var center: CGPoint! //center of the CS
let maxSize: CGSize = CGSize.init(width: 100, height: 100) // maximum size of our scaling view
var maxLengthToCenter: CGFloat! //maximum distance from the center of the CS to the furthest point in the CS

private func prepareForScaling() {
    self.center = self.view.center //we set the center of our CS to equal the center of the VC's view
    let frame = self.view.frame
    //the furthest distance in the CS is the diagonal, and we calculate it using pythagoras theorem
    self.maxLengthToCenter = (frame.width*frame.width + frame.height*frame.height).squareRoot() 
}

Затем нам нужно вызвать наш функционал настройки, чтобы наши данные были готовы к функциям масштабирования — мы можем сделать это в viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()  
    self.prepareForScaling()
}

Затем нам нужна вспомогательная функция для вычисления масштабированного размера нашего представления для текущего положения жеста панорамирования пользователя на экране.

private func scaledSize(for location: CGPoint) -> CGSize {
    //calculate location x,y differences from the center
    let xDifference = location.x - self.center.x
    let yDifference = location.y - self.center.y

    //calculate the scale factor - note that this factor will be between 0.0(center) and 0.5(diagonal - furthest point)    
    //It is due our measurement - from center to view's edge. Consider multiplying this factor with your custom constant.
    let scaleFactor = (xDifference*xDifference + yDifference*yDifference).squareRoot()/maxLengthToCenter
    //create scaled size with maxSize and current scale factor
    let scaledSize = CGSize.init(width: maxSize.width*(1-scaleFactor), height: maxSize.height*(1-scaleFactor))

    return scaledSize
}

И, наконец, нам нужно изменить действие жеста панорамирования, чтобы изменить размер A:

@IBAction func panGestureAction(_ sender: UIPanGestureRecognizer) {
    UIView.animateKeyframes(withDuration: 0.1, delay: 0, options: UIViewKeyframeAnimationOptions.calculationModeLinear, animations: {

        let location = sender.location(in: sender.view?.superview)

        sender.view?.frame = CGRect.init(origin: CGPoint.init(x: 0, y: 0), size: self.scaledSize(for: location))

        sender.view?.center = location
    })
}
person Easy Soft    schedule 14.11.2017
comment
Но в этом решении вы используете рамку изменения размера UIView. Я хочу использовать CGAffineTransform для перемещения и масштабирования. - person Thuan Nguyen; 14.11.2017