我的矢量精灵渲染在模拟器和设备的不同位置

时间:2010-09-06 05:31:38

标签: iphone xcode uiview resolution resolution-independence

我正在实现一个UIView的子类,它显示一个带有指针精灵的表盘。它具有角度属性,我可以改变,使针指向不同的角度。它的工作原理,但针的位置相同的值使它显示在手机和模拟器的不同位置。这是iPhone 4,所以我确定双重分辨率的事情背后是这个,但我不知道该怎么做。我尝试设置UIView's layer's contentScaleFactor,但失败了。我以为UIView免费获得了解决方案。有什么建议吗?

我应该注意,NSLog语句在模拟器和设备中报告了两个.frame.size.维度。

这是.m文件

更新:在模拟器中,我找到了如何将硬件设置为iPhone 4,它看起来就像现在的设备一样,都是缩放和定位精灵的一半。

更新2:我做了一个解决方法。我将我的精灵的.scale设置为等于UIView's contentScaleFactor,然后使用它将UIView潜入水中,如果它是一个低分辨率的屏幕,那么如果它是高分辨率则全长。我仍然不明白为什么这是必要的,因为我现在应该在点上工作,而不是像素。它必须与SpriteVectorSprite类中的自定义绘图代码有关。

如果有人有一些反馈,我仍然会感激一些反馈......


#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

1 个答案:

答案 0 :(得分:1)

我相信答案是iOS在drawRect方法中自动处理分辨率缩放,但在自定义绘图代码中,您必须自己完成。

在我的示例中,我使用UIView's contentsScaleFactor来扩展我的精灵。将来,在我的自定义draw方法(未显示)中,我会查询[UIScreen mainScreen] scale并相应地进行缩放。