NSImageViewのアンチエイリアス
TL;DR: Big Sur だと NSImageView はアンチエイリアスをしてくれない。サブクラス作って無理矢理アンチエイリアスさせる方法はあるが何でそうなるかが不明だし CALayer とか使って独自でやったほうがいいと思う
以下調査ログ:
NSImageViewに適当にでかい画像を入れて小さい枠に入れると、
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を使えという情報もあった のでそちらも試してみたが結果が変わらないように見える。これはなんなんだ………
さらに調べると
https://tweet-card.now.sh/1341699488063180807.jpg?lang=ja https://twitter.com/helje5/status/1341699488063180807 https://twitter.com/helje5/status/1341699488063180807
こういうツイートがある。どうやら NSImageView はもはやアンチエイリアスをかけてくれないようなので CALayer で自分で実装するのが賢そう
#macOS開発 #AppKit #ご意見募集中