我正在努力让我的自定义绘图代码以适当的比例呈现所有iOS设备,即旧的iPhone,带有视网膜显示器和iPad。
我有一个UIView
的子类,它有一个显示矢量图形的自定义类。它有scale
属性,我可以设置。当initWithCoder
加载并且我首先实例化矢量图形时,我在UIView
中进行缩放。当用户点击主屏幕上的按钮时,会显示此UIView
。
起初我试过这个:
screenScaleFactor = 1.0;
if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
screenScaleFactor = [[UIScreen mainScreen] scale];
}
// and then I multiply stuff by screenScale
...适用于普通iPhone和视网膜iPhone,但在iPad上窒息。正如我所说,您可以通过点击主屏幕上的按钮来查看有问题的UIView
。在iPad上运行时,如果在1X时显示UIView
,它可以正常工作,但在2X时,我会得到一个两倍大的矢量图形。
所以我尝试了这个:
更新:这个区块是正确的。 (当然,纠正拼写!)
screenScaleFactor = 1.0;
if ([self respondsToSelector:@selector(contentScaleFactor)]) { //EDIT: corrected misspellng.
screenScaleFactor = (float)self.contentScaleFactor;
}
// again multiplying stuff by screenScale
适用于iPad和旧款iPhone的1X和2X,但在视网膜显示屏上,矢量图形的大小应该是它的一半。
在第一种情况下,我向UIScreen
查询其scale
属性,在第二种情况下,我向向量图的父view
询问其{{1} }}。对于所有情况,这些似乎都没有让我想到我想要的地方。
有什么建议吗?
更新:
这是我的子类contentsScaleFactor
中的方法(它叫做GaugeView):
UIView
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGAffineTransform t0 = CGContextGetCTM(context);
t0 = CGAffineTransformInvert(t0);
CGContextConcatCTM(context, t0);
[needle updateBox];
[needle draw: context];
}
属于needle
类,它是VectorSprite
的子类,它是Sprite
的子类。这些来自我正在编写的编程书。 NSObject
具有我设置的scale属性。
needle
来自updateBox
,看起来像这样:
Sprite
- (void) updateBox {
CGFloat w = width*scale;
CGFloat h = height*scale;
CGFloat w2 = w*0.5;
CGFloat h2 = h*0.5;
CGPoint origin = box.origin;
CGSize bsize = box.size;
CGFloat left = -kScreenHeight*0.5;
CGFloat right = -left;
CGFloat top = kScreenWidth*0.5;
CGFloat bottom = -top;
offScreen = NO;
if (wrap) {
if ((x+w2) < left) x = right + w2;
else if ((x-w2) > right) x = left - w2;
else if ((y+h2) < bottom) y = top + h2;
else if ((y-h2) > top) y = bottom - h2;
}
else {
offScreen =
((x+w2) < left) ||
((x-w2) > right) ||
((y+h2) < bottom) ||
((y-h2) > top);
}
origin.x = x-w2*scale;
origin.y = y-h2*scale;
bsize.width = w;
bsize.height = h;
box.origin = origin;
box.size = bsize;
}
也有Sprite
和draw
方法:
drawBody
答案 0 :(得分:1)
你究竟是如何渲染图形的?
这应该在drawRect:
中自动处理(你得到的上下文应该已经是2倍)。如果可用,也应该使用UIGraphicsBeginImageContextWithOptions(size,NO,0);
自动处理(如果需要回退到UIGraphicsBeginImageContext(),则假设比例为1)。除非你以某种方式自己绘制位图,否则你不必担心它。
您可以尝试使用self.contentScaleFactor = [[UIScreen mainScreen] scale]
之类的东西,先进行适当的检查(这可能意味着如果您以2倍的速度在iPad上显示它,您将获得高分辨率的图形)。
从根本上说,2x模式的iPad与“视网膜显示器”之间没有太大区别,只是iPad可以在1x和2x之间切换。
最后,有一个错字:@selector(contentsScaleFactor)有一个额外的s。