首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift - CGAffineTransform旋转

Swift - CGAffineTransform旋转
EN

Stack Overflow用户
提问于 2022-03-10 09:15:16
回答 1查看 202关注 0票数 0

我有一个UIImageViewdraw函数中旋转。

代码语言:javascript
复制
public var progress: CGFloat = 0 {
    didSet {
        setNeedsDisplay()
    }
}

override public func draw(_ rect: CGRect) {
    rotateIcon(by: progress)
}

private func rotateIcon(by angle: CGFloat) {
    if imageView == nil {
        imageView = UIImageView(image: UIImage(named: "bt_info"))
        imageView?.center = center
        imageView?.frame.size = CGSize(width: 24.0, height: 24.0)
        addSubview(imageView!)
    }
    imageView?.transform = CGAffineTransform(rotationAngle: angle)
}

下面是为上面的片段附加的输出。

当我设置帧大小时,imageView在旋转时会收缩和扩展。我想在imageView旋转时保持大小。我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-10 20:40:26

好的-你在问题中发布的代码与Dropbox项目中的代码不匹配.

在你的项目中,你要这样做:

代码语言:javascript
复制
private func rotateScannerIcon(by angle: CGFloat) {
    if testView == nil {
        testView = UIView()
        testView?.backgroundColor = .red
        addSubview(testView!)
    }
    
    let centerPoint = CGPoint(x: bounds.midX, y: bounds.midY)
    testView?.center = centerPoint
    testView?.frame.size = CGSize(width: 24.0, height: 24.0)

    testView?.transform = CGAffineTransform(rotationAngle: angle)
}

使用该代码,在应用了旋转转换后,您将更改帧大小.而实际的景观不再是“方形”了。

如果您在"create“块中移动位置/大小代码:

代码语言:javascript
复制
private func rotateScannerIcon(by angle: CGFloat) {
    if testView == nil {
        testView = UIView()
        testView?.backgroundColor = .red
        addSubview(testView!)

        let centerPoint = CGPoint(x: bounds.midX, y: bounds.midY)
        testView?.center = centerPoint
        testView?.frame.size = CGSize(width: 24.0, height: 24.0)
    }
    
    testView?.transform = CGAffineTransform(rotationAngle: angle)
}

框架的“挤压”不再发生。

然而,覆盖draw()可能不是最好的方法。这主要是在UIKit视图更新不足以处理布局时完成的,例如在路径上使用笔画/填充时。

所以,我建议你做些改变。

初始化自定义视图子类时创建您的子视图(UIViewUIImageView或其他什么),并使用自动布局约束对其大小/位置进行限制。

然后,在更新progress属性时,应用旋转转换。

举个例子,下面是TestView类的修改版本:

代码语言:javascript
复制
public class TestView: UIView {
    
    public var progress: CGFloat = 0 {
        didSet {
            rotateScannerIcon(by: (progress * CGFloat(Double.pi)))
        }
    }
    
    internal var testView: UIView!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() {
        // create the view (or image view)
        testView = UIView()
        testView.backgroundColor = .red
        
        // add it to self
        addSubview(testView)
        
        // let's use auto-layout constraints
        testView.translatesAutoresizingMaskIntoConstraints = false
        
        NSLayoutConstraint.activate([
            // constrain the view to 24 x 24, centered in self
            testView.widthAnchor.constraint(equalToConstant: 24.0),
            testView.heightAnchor.constraint(equalTo: testView.widthAnchor),
            testView.centerXAnchor.constraint(equalTo: centerXAnchor),
            testView.centerYAnchor.constraint(equalTo: centerYAnchor),
        ])
        
    }

    private func rotateScannerIcon(by angle: CGFloat) {
        testView.transform = CGAffineTransform(rotationAngle: angle)
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71421578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档