.aspectFill在NSImageView上

时间:2018-07-10 22:48:34

标签: swift macos nsimageview

我要将SpriteKit应用程序从iOS移植到MacOS。我正在main.storyboard中设计主菜单,并且有一个图像作为背景。但是,当我调整窗口大小时,我的图像无法填满整个屏幕。

我尝试过:

.scaleAxesIndependently //???
.scaleNone //Centre
.scaleProportionallyDown //???
.scaleProportionallyUpOrDown //AspectFit

,但与.aspectFill相同。

我正在使用swift

1 个答案:

答案 0 :(得分:1)

子类化NSImageView并覆盖intrinsicContentSize,您将能够调整图像保持宽高比的大小,如下所示:

class AspectFillImageView: NSImageView {
    override var intrinsicContentSize: CGSize {
        guard let img = self.image else { return .zero }

        let viewWidth = self.frame.size.width
        let ratio = viewWidth / img.size.width
        return CGSize(width: viewWidth, height: img.size.height * ratio)
    }
}

如果您只想填充整个视图而忽略该比例,请改用以下扩展名:

extension NSImage {
    func resize(to size: NSSize) -> NSImage {
        return NSImage(size: size, flipped: false, drawingHandler: {
            self.draw(in: $0)
            return true
        })
    }
}

扩展用法:

NSImage.resize(to: self.view.frame.size)