在下面的程序中,无论我在CGAffineTransform(scaleX:Y:)的参数中输入什么值,我都会得到相同的绘制结果.

为什么会这样呢?

import UIKit

class ViewController: UIViewController {
  
  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.view.backgroundColor = .gray
  }

  override func viewWillAppear(_ animated: Bool) {
    let scalingView = ScalingView(frame: self.view.bounds)
    self.view.addSubview(scalingView)
  }
}
import UIKit

class ScalingView: UIView {
  let subview: UIView!
  
  override init(frame: CGRect) {
    subview = UIView()
    super.init(frame: frame)
    addSubview(subview)
  }
  
  required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
  
  override func layoutSubviews() {
    subview.backgroundColor = .white
    let subviewSize = 100
    subview.frame.size = CGSize(width: subviewSize, height: subviewSize)
    subview.center = CGPoint(x: self.bounds.midX, y: self.bounds.midY)
    subview.transform = CGAffineTransform(scaleX: 1, y: 1)
  }
}

subview.transform = CGAffineTransform(scaleX: 1, y: 1)

scaleX: 1, y: 1


subview.transform = CGAffineTransform(scaleX: 2, y: 2)

scaleX: 2, y: 2


subview.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)

scaleX: 0.5, y: 0.5


https://github.com/ll3Ynxnj/Sample-Swift-ViewScaling.git

推荐答案

问题是,每次执行subview.transform时,layoutSubviews函数也会被调用,子视图框也会更改.在没有动画或延迟的情况下,它实际上会变换回原始帧.你可以把animate个放在一起判断:

UIView.animate(withDuration: 1) {
    self.subview.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
}

为了避免这种情况,您必须将设置大小和边框移到init,这样它就会被调用一次.然后从外部转变,可能是从ViewController:

class ScalingView: UIView {
    override init(frame: CGRect) {
        ...
        let subviewSize = 100
        subview.frame.size = CGSize(width: subviewSize, height: subviewSize)
        subview.center = CGPoint(x: self.bounds.midX, y: self.bounds.midY)
    }

    func scaleSubView(_ scale: CGFloat = 1.5) {
        UIView.animate(withDuration: 0.3) {
            self.subview.transform = CGAffineTransform(scaleX: scale, y: scale)
        }
    }
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    scalingView.scaleSubView()
}

注意:@Matt和@HangarRash的建议很有帮助,你应该遵循它.

Swift相关问答推荐

更改 SwiftUI 中按钮矩阵的填充 colored颜色

在表单中对齐文本框

Xcode 15 Beta中如何使用@Observable?

如何在 SwiftUI 中为过渡动画保持相同的标识

从一个范围减go 多个范围

URL appendPathComponent(_:) 已弃用?

在 Swift 的异步上下文中,如何指示我想要函数的同步版本?

如何裁剪图像 3:4 ?迅速

如何在 SwiftUI 中正确实现Collection 夹?

如何在 SwiftUI 的 fileImporter 中为 allowedContentTypes 设置 xcodeproj 类型?

我如何从 UIAlertController 导航到新屏幕(swiftUI)

RealityKit – 无法加载 ARView(发现为零)

使用 swift 运行 pod install 时出错

Swift 动画 WithDuration 语法是什么?

MKAnnotation Swift

Swift:如何从函数返回类类型

3D touch /强制touch 实现

SwiftUI - 呈现工作表后导航栏按钮不可点击

如何判断 firebase 数据库值是否存在?

判断用户是否登录到 iCloud?Swift /iOS