我正在实现一个UIView
的子类,它显示一个带有指针精灵的表盘。它具有角度属性,我可以改变,使针指向不同的角度。它的工作原理,但针的位置相同的值使它显示在手机和模拟器的不同位置。这是iPhone 4,所以我确定双重分辨率的事情背后是这个,但我不知道该怎么做。我尝试设置UIView's
layer's
contentScaleFactor
,但失败了。我以为UIView
免费获得了解决方案。有什么建议吗?
我应该注意,NSLog
语句在模拟器和设备中报告了两个.frame.size.
维度。
这是.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
答案 0 :(得分:1)
我相信答案是iOS在drawRect方法中自动处理分辨率缩放,但在自定义绘图代码中,您必须自己完成。
在我的示例中,我使用UIView's contentsScaleFactor
来扩展我的精灵。将来,在我的自定义draw
方法(未显示)中,我会查询[UIScreen mainScreen] scale
并相应地进行缩放。