我知道,当使用以下片段创建图像并将其分配给视图的层内容时,当视图的后台属性发生变化时,即窗口移动到视网膜显示器或从视网膜显示器移动时,渲染块会自动再次执行。
[NSImage imageWithSize:size flipped:NO drawingHandler:^BOOL(NSRect rect) {
CGContextRef const context = NSGraphicsContext.currentContext.graphicsPort;
....
return YES;
}];
在这个渲染块中,我正在尝试将另一个NSImage垂直居中。我希望这个在高分辨率显示器上看起来尽可能居中,但在非视网膜屏幕上不会模糊。因此,我想知道是否有任何方法可以找出图像渲染的内容ScaleFactor。
这应该很简单,但即使在互联网上尝试和搜索了几个小时后,我也没有找到一种方法来确定图像是否是为视网膜屏幕渲染的。
来自OS X的高分辨率指南:支持高分辨率的API——获取规模信息:
CGContextRef
获取CGContext的缩放信息的首选方式对象是调用转换函数
CGContextConvertRectToDeviceSpace
:deviceRect = CGContextConvertRectToDeviceSpace(context, userRect);
然后可以将
deviceRect.size.height
除以userRect.size.height
。这适用于隐式缩放窗口上下文和显式缩放位图上下文。
不过,我并不认为你应该计算这个比例。我认为您应该将图形处理程序的rect
参数和用任意原点构造的矩形(NSZeroPoint
可以)以及您试图居中的图像大小从用户空间转换为设备空间。调整后者的原点,使其在设备空间中以数学方式位于前者的中心。使用NSIntegralRectWithOptions()
对结果进行积分。然后,使用CGContextConvertRectToUserSpace()
将其转换回用户空间。将图像绘制到生成的矩形中。
我认为它可以通过实现
CGFloat const scale = CGBitmapContextGetWidth(context) / rect.size.width;
然而,我认为这不是一个好的解决方案,应该/必须有更好的解决方案。