为不同的iOS分辨率缩放自定义绘制代码

时间:2010-09-12 02:03:03

标签: iphone xcode resolution

我正在努力让我的自定义绘图代码以适当的比例呈现所有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; } 也有Spritedraw方法:

drawBody

1 个答案:

答案 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。