Мой векторный спрайт отображается в разных местах на симуляторе и устройстве - PullRequest
1 голос
/ 06 сентября 2010

Я реализую подкласс 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

1 Ответ

1 голос
/ 08 сентября 2010

Я полагаю, что ответ заключается в том, что iOS заботится о масштабировании разрешения автоматически в методах drawRect, но в пользовательском коде рисования вы должны сделать это самостоятельно.

В моем примере я использовал UIView's contentsScaleFactorмасштабировать мой спрайт.В будущем, в моем пользовательском методе draw (не показан), я сделаю запрос [UIScreen mainScreen] scale и масштабируюсь там соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...