NSImageViewのアンチエイリアス
TL;DR: Big Sur だと NSImageView はアンチエイリアスをしてくれない。サブクラス作って無理矢理アンチエイリアスさせる方法はあるが何でそうなるかが不明だし CALayer とか使って独自でやったほうがいいと思う
以下調査ログ:
https://gyazo.com/3a7ad5c1e29fdbfb7c2ddbc9da42fe89
こういう風にめちゃくちゃ適当な縮小がされる (上記画像はその結果を400%ぐらいにしたもの)
で、これをどうにかする方法はないか、と思って
code:AntialiasedImageView.swift
import Cocoa
class AntialiasedImageView: NSImageView {
override func draw(_ dirtyRect: NSRect) {
guard let ctx = NSGraphicsContext.current else {
return
}
let orig = ctx.shouldAntialias
ctx.shouldAntialias = true
super.draw(dirtyRect)
ctx.shouldAntialias = orig
}
}
こういうコードを書いたらいい感じにアンチエイリアスがかかるようになって、おお〜いい感じじゃんアンチエイリアス無しと比較しよう、と思って ctx.shouldAntialias を false にして再実行したら、アンチエイリアスがかかったままになってしまった。環境設定で一応変更可能にしたかったのでこれでは困る。
で、調べたところ、これだけでアンチエイリアスがかかるようだ。
code:swift
import Cocoa
class AntialiasedImageView: NSImageView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
}
これはどういう理屈なんだ????
ちなみに shouldAntialias でなく imageInterpolationを使えという情報もあった のでそちらも試してみたが結果が変わらないように見える。これはなんなんだ……… さらに調べると
こういうツイートがある。どうやら NSImageView はもはやアンチエイリアスをかけてくれないようなので CALayer で自分で実装するのが賢そう