1

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

我应该注意到,在模拟器和设备中,NSLog报表在两个.frame.size.维度上都报告了 150。

这是.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
4

1 回答 1

1

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

In my example, I used the UIView's contentsScaleFactor to scale my sprite. In the future, in my custom draw method (not shown) I'll query [UIScreen mainScreen] scale and scale accordingly there.

于 2010-09-08T13:57:09.090 回答