美文网首页
NSView旋转

NSView旋转

作者: 本帅不良 | 来源:发表于2020-12-30 11:23 被阅读0次

一个看似简单的旋转,用了大半天的时间,有必要总结一下。

首先献上网上旋转动画的代码

链接:https://www.jianshu.com/p/f568a55e1f9f
此教程实现了连续旋转,动画结束后,会回到原来的状态,如果我们需要实现图片旋转 90 度的功能就不行了
核心代码:

let oldFrame = imageView.layer!.frame
imageView.wantsLayer = true
let animation = CABasicAnimation.init(keyPath: "transform.rotation")
animation.timingFunction = CAMediaTimingFunction.init(name: CAMediaTimingFunctionName.linear)
animation.fromValue = 0
animation.toValue = CGFloat.pi / 2
animation.duration = 0.5
animation.repeatCount = 1
let cent_x = imageView.frame.origin.x + imageView.frame.size.width/2
let cent_y = imageView.frame.origin.y + imageView.frame.size.height/2
//旋转锚点
imageView.layer?.anchorPoint = CGPoint.init(x: 0.5, y: 0.5)
//旋转位置
imageView.layer?.position = CGPoint.init(x: cent_x, y: cent_y)
imageView.layer?.add(animation, forKey: nil)

代码略作改进

如何实现旋转 90 度呢

链接:https://developer.apple.com/documentation/appkit/nsview?language=objc

官方文档
官方提供了以上方法

如何使用呢:

let cent_x = imageView.frame.origin.x + imageView.frame.size.width/2
let cent_y = imageView.frame.origin.y + imageView.frame.size.height/2
let wid = imageView.frame.size.width
let hei = imageView.frame.size.height
let newFrame = CGRect.init(x: cent_x-hei/2, y: cent_y-wid/2, width: hei, height: wid)
imageView.frame = newFrame
imageView.translateOrigin(to: NSPoint.init(x: cent_x, y: cent_y))
imageView.rotate(byDegrees: -90)
currentRotate += 1

需要注意的点:

  1. imageView是一个 NSImageView,由于NSImageView集成自NSControl,NSControl集成自NSView,此例使用NSImageView没毛病
  2. imageView要设置的尽可能大一些,以防旋转后图片被挤压
  3. currentRotate是用来记录旋转角度的
  4. 由于旋转的是整个控件,所以当用这个控件加载其他的图片的时候,要旋转回去
  5. 需要重新设置控件的 frame,否则样式会异常,猜测是translateOrigin方法中传的点并不贴切导致的

核心代码展示:

    //用于记录旋转角度
    var currentRotate:Int = 0{
        didSet{
            if currentRotate == -4 || currentRotate == 4 {
                currentRotate = 0
            }
            print("currentRotete",currentRotate)
        }
    }

    //顺时针旋转 90 度
    @IBAction func turnRight90(_ sender: NSButton?) {
        let cent_x = imageView.frame.origin.x + imageView.frame.size.width/2
        let cent_y = imageView.frame.origin.y + imageView.frame.size.height/2
        let wid = imageView.frame.size.width
        let hei = imageView.frame.size.height
        let newFrame = CGRect.init(x: cent_x-hei/2, y: cent_y-wid/2, width: hei, height: wid)
        imageView.frame = newFrame
        imageView.translateOrigin(to: NSPoint.init(x: cent_x, y: cent_y))
        imageView.rotate(byDegrees: -90)
        currentRotate += 1
    }

    //逆时针旋转 90 度
    @IBAction func turnLeft90(_ sender: NSButton?) {
        
        let cent_x = imageView.frame.origin.x + imageView.frame.size.width/2
        let cent_y = imageView.frame.origin.y + imageView.frame.size.height/2
        let wid = imageView.frame.size.width
        let hei = imageView.frame.size.height
        let newFrame = CGRect.init(x: cent_x-hei/2, y: cent_y-wid/2, width: hei, height: wid)
        imageView.frame = newFrame
        imageView.translateOrigin(to: NSPoint.init(x: cent_x, y: cent_y))
        imageView.rotate(byDegrees: 90)
        currentRotate -= 1

    }

恢复旋转角度的代码:

        while currentRotate != 0 {
            if currentRotate > 0 {
                turnLeft90(nil)
            }else{
                turnRight90(nil)
            }
        }

相关文章

  • NSView旋转

    一个看似简单的旋转,用了大半天的时间,有必要总结一下。 首先献上网上旋转动画的代码 链接:https://www....

  • Mac开发

    NSView、设置BackgroundColor NSView *view = [[NSView alloc] i...

  • NSView绕中心点旋转

    我们可以NSView添加一个扩展,实现一个开始动画的过程。我们可以使用CABasicAnimation来实现,通常...

  • macOS开发-知识点总结

    NSView的背景绘制为图片 支持NSView的拖拽操作 判断NSWindow是否全屏

  • NSViewAnimation的简介与使用

    简介 NSViewAnimation提供了NSView或NSWindow简易的动画效果,可以改变NSView或NS...

  • view转image

    -(NSImage*)viewToImage:(NSView*)view { NSBitmapImageRep...

  • NSView 转换图片

    macOS NSView 转化出图片数据

  • macOS 开发-NSView

    NSView是用于应用程序中渲染、打印以及处理事件的基础容器。 概要 通常我们不需要直接使用NSView对象,而是...

  • macOS 开发-NSView API

    NSView用于在应用程序中渲染、打印以及处理事件的基础容器。 概要 通常我们不需要直接使用NSView对象,而是...

  • 13. Drawing Strings

    You can draw string objects directly in a focused NSView ...

网友评论

      本文标题:NSView旋转

      本文链接:https://www.haomeiwen.com/subject/pjocoktx.html