UIView transform.scaleBy анимация не работает - PullRequest
0 голосов
/ 10 июня 2018

Я занимался программированием под iOS для Objective C, но бросил учебу, когда Apple перешла на Swift.Совсем недавно начал пытаться изучать Swift и собрал очень простое приложение, чтобы понять его.

У меня есть экран, который начинается с UIView, и три кнопки, как показано.Кнопка «Расти» предназначена для увеличения масштаба вида (redBox), а кнопка «Уменьшить» должна сделать наоборот.Кнопка «Изменить цвет» изменяет цвет фона redBox на случайный цвет.Все изменения предназначены для анимации с использованием UIView.animate(withDuration: 2, animations:

Изменение цвета работает, но масштабирование - нет.Надеюсь, кто-то может сказать мне, где я иду не так.

Вот код, и вся помощь приветствуется:

import UIKit
import CoreGraphics

public extension UIColor {
    public static var random: UIColor {
        let max = CGFloat(UInt32.max)
        let red = CGFloat(arc4random()) / max
        let green = CGFloat(arc4random()) / max
        let blue = CGFloat(arc4random()) / max

        return UIColor(red: red, green: green, blue: blue, alpha: 1.0)
    }
}

class ViewController: UIViewController {

    @IBOutlet weak var redBox: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }



    @IBAction func growBox(_ sender: UIButton) {
        UIView.animate(withDuration: 2, animations: {
        self.redBox.transform.scaledBy(x: 1.1, y: 1.1)
    },completion: nil)
    }



    @IBAction func shrinkIt(_ sender: UIButton) {
        UIView.animate(withDuration: 2, animations: {
            self.redBox.transform.scaledBy(x: 0.9, y: 0.9)
        },completion: nil)

    }



    @IBAction func changeColor(_ sender: UIButton) {
        UIView.animate(withDuration: 2, animations: {
            self.redBox.backgroundColor = UIColor.random
    }, completion: nil)
}

}

Редактировать 1:

В ответ ниже, яизменил код преобразования на:

@IBAction func growBox(_ sender: UIButton) {
    UIView.animate(withDuration: 2, animations: {
    self.redBox.transform = self.redBox.transform.scaledBy(x: 1.05, y: 1.05)
},completion: nil)
}



@IBAction func shrinkIt(_ sender: UIButton) {
    UIView.animate(withDuration: 2, animations: {
        self.redBox.transform = self.redBox.transform.scaledBy(x: 0.95238, y: 0.95238)
    },completion: nil)

}

Хотя это, похоже, работает, преобразование «сжимается» оставляет некоторые следы, например так:

enter image description here

Кто-нибудь знает, что это значит?

Ответы [ 4 ]

0 голосов
/ 10 июня 2018
@IBAction func growBox(_ sender: Any) {
    UIView.animate(withDuration: 2, animations: {
        self.redView.transform = self.redView.transform.scaledBy(x: 1.1, y: 1.1)
    },completion: nil)
}
0 голосов
/ 10 июня 2018

Ошибка, которую вы допустили, заключается в том, что вы думали, что scaledBy изменит свойство transform.

Это не так.Имена методов в Swift могут фактически сказать вам, будут ли они мутировать объект, к которому они вызваны, или нет!Посмотрите, как оно называется scaledByd) вместо scaleBy.Это говорит о том, что этот метод вернет новое преобразование, которое масштабируется.Потому что на английском языке вы бы сказали что-то вроде этого:

Мне бы хотелось, чтобы преобразование этого представления было именно этим преобразованием, но масштаб *** d *** в 2

* раза.1012 *

В коде вы можете написать это так:

thisView.transform = thisParticularTransformation.scaledBy(x: 2, y: 2)

Вот как предполагается использовать scaledBy.

Если вы хотите изменить преобразование представления наабсолютное (как не относительно другого преобразования), вам нужно создать новый CGAffineTransform:

self.redBox.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
0 голосов
/ 10 июня 2018

Вы просто не изменили преобразование, поэтому оно не работает

Вы должны создать новый объект AffineTransform и назначить ему.

Заменить

self.redBox.transform.scaledBy(x: 1.1, y: 1.1)

с

self.redBox.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
0 голосов
/ 10 июня 2018

Вы можете попробовать это:

@IBAction func growBox(_ sender: UIButton) {
    UIView.animate(withDuration: 2, animations: {
        self.redBox.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
    }, completion: nil)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...