我正在实现一个子类,UIView
它显示一个带有指针精灵的仪表盘。它具有角度属性,我可以改变它以使针指向不同的角度。它可以工作,但针位置的相同值使其显示在手机和模拟器上的不同位置。这是一部 iPhone 4,所以我确信双分辨率的东西在这背后,但我不知道该怎么办。我尝试设置UIView's
layer's
contentScaleFactor
但失败了。我以为UIView
免费得到了解决方案。有什么建议么?
我应该注意到,在模拟器和设备中,NSLog
报表在两个.frame.size.
维度上都报告了 150。
这是.m文件
更新:在模拟器中,我发现了如何将硬件设置为 iPhone 4,它看起来就像现在的设备一样,都在缩放和定位精灵的一半大小。
更新2:我做了一个解决方法。我将.scale
我的精灵的 设置为等于UIView's contentScaleFactor
,然后如果它是一个低分辨率屏幕,则使用它来对半俯冲UIView
,如果它是高分辨率屏幕,则使用它来俯冲全宽。我仍然不明白为什么这是必要的,因为我现在应该以点为单位工作,而不是像素。它必须与Sprite
或VectorSprite
类中的自定义绘图代码有关。
如果有人有一些反馈,我仍然会很感激......
#import "GaugeView.h"
@implementation GaugeView
@synthesize needle;
#define kVectorArtCount 4
static CGFloat kVectorArt[] = {
3,-4,
2,55,
-2,55,
-3,-4
};
- (id)initWithCoder:(NSCoder *)coder {
if (self = [super initWithCoder:coder]) {
needle = [VectorSprite withPoints:kVectorArt count:kVectorArtCount];
needle.scale = (float)self.contentScaleFactor; // returns 1 for lo-res, 2 for hi-res
NSLog(@" needle.scale = %1.1f", needle.scale);
needle.x = self.frame.size.width / ((float)(-self.contentScaleFactor) + 3.0); // divisor = 1 for hi-res, 2 for lo-res
NSLog(@" needle.x = %1.1f", needle.x);
needle.y = self.frame.size.height / ((float)(-self.contentScaleFactor) + 3.0);
NSLog(@" needle.y = %1.1f", needle.y);
needle.r = 0.0;
needle.g = 0.0;
needle.b = 0.0;
needle.alpha = 1.0; }
}
self.backgroundColor = [UIColor clearColor];
return self;
}
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
// Initialization code
}
return self;
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGAffineTransform t0 = CGContextGetCTM(context);
t0 = CGAffineTransformInvert(t0);
CGContextConcatCTM(context, t0);
[needle updateBox];
[needle draw: context];
}
- (void)dealloc {
[needle release];
[super dealloc];
}
@end