Я реализую подкласс UIView
, который отображает шкалу датчика со спрайтом для индикатора.У него есть свойство угла, которое я могу изменить, чтобы стрелка указывала на разные углы.Он работает, но при одинаковых значениях положения иглы он отображается в разных местах телефона и симулятора.Это iPhone 4, так что я уверен, что за этим стоит двойное разрешение, но я не знаю, что с этим делать.Я попытался установить UIView's
layer's
contentScaleFactor
, но это не удалось.Я думал, что UIView
получил разрешение бесплатно.Любые предложения?
Следует отметить, что операторы NSLog
сообщают 150 как для .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