Отображение изображений Retina — iPhone 3–4

Я разработал приложение тайловой игры для iPhone 3. В котором я взял изображение со своего ресурса и разделил его на количество тайлов с помощью функции CGImageCreateWithImageInRect ( originalImage.CGImage, frame );.

Он отлично работает на всех iPhone, но теперь я хочу, чтобы он работал и на дисплеях Retina.

Итак, в соответствии с это link Я взял другое изображение, размер которого в два раза превышает размер текущего изображения, и переименовал его, добавив суффикс @2x. Но проблема в том, что он занимает только верхнюю половину изображения на дисплее сетчатки. Я думаю, это из-за фрейма, который я установил при использовании CGImageCreateWithImageInRect. Итак, что нужно сделать, чтобы сделать эту работу.

Любая помощь будет действительно оценена.

Заранее спасибо...


person Suresh Varma    schedule 15.01.2011    source источник


Ответы (2)


Проблема, вероятно, в том, что масштаб изображения @2x автоматически настраивается правильно только для определенных инициализаторов UIImage... -4s-retina-display/" rel="nofollow">Попробуйте загрузить свои UIImages, используя подобный код из Tasty Pixel. Запись по этой ссылке больше говорит об этой проблеме.

Используя категорию UIImage+TPAdditions из ссылки, вы реализуете ее следующим образом (убедившись, что изображения и их аналоги @2x есть в вашем проекте):

NSString *baseImagePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString *myImagePath = [baseImagePath stringByAppendingPathComponent:@"myImage.png"]; // note no need to add @2x.png here
UIImage *myImage = [UIImage imageWithContentsOfResolutionIndependentFile:myImagePath];

Тогда вы сможете использовать CGImageCreateWithImageInRect(myImage.CGImage, frame);

person Victor Van Hee    schedule 15.01.2011
comment
Я тоже пробовал это, но не получил масштаб == 2.0. Я пробовал в симуляторе. - person Suresh Varma; 15.01.2011
comment
Также без реализации этого он брал мое изображение с именем @2x в качестве суффикса. Но теперь, поскольку приведенное выше условие не соответствует, мое изображение @2x вообще не принимается. - person Suresh Varma; 15.01.2011
comment
Я отредактировал свой ответ - опубликуйте немного своего кода, если он не работает, и я постараюсь помочь. - person Victor Van Hee; 15.01.2011
comment
Я сделал то же самое.. Он берет изображение @2x.. но все же обрезает только верхнюю половину изображения и опускает нижнюю половину. - person Suresh Varma; 16.01.2011

Вот как я заставил это работать в приложении, которое я сделал:

//this is a method that takes a UIImage and slices it into 16 tiles (GridSize * GridSize)
#define GridSize 4
- (void) sliceImage:(UIImage *)image {
    CGSize imageSize = [image size];
    CGSize square = CGSizeMake(imageSize.width/GridSize, imageSize.height/GridSize);

    CGFloat scaleMultiplier = [image scale];

    square.width *= scaleMultiplier;
    square.height *= scaleMultiplier;

    CGFloat scale = ([self frame].size.width/GridSize)/square.width;

    CGImageRef source = [image CGImage];
    if (source != NULL) {
        for (int r = 0; r < GridSize; ++r) {
            for (int c = 0; c < GridSize; ++c) {
                CGRect slice = CGRectMake(c*square.width, r*square.height, square.width, square.height);
                CGImageRef sliceImage = CGImageCreateWithImageInRect(source, slice);
                if (sliceImage) {
                    //we have a tile (as a CGImageRef) from the source image
                    //do something with it
                    CFRelease(sliceImage);
                }
            }
        }
    }
}

Хитрость заключается в использовании свойства -[UIImage scale], чтобы выяснить, насколько большой прямоугольник вы должны нарезать.

person Dave DeLong    schedule 15.01.2011
comment
То есть вы хотите сказать, что если бы я брал фрагмент 100x100 в iPhone 3, то для ретин-дисплея мне нужно взять фрагмент 200x200? Это так? - person Suresh Varma; 16.01.2011
comment
Пробовал ваш код, но он увеличивает плитку, поэтому плитки исчезают с экрана :( - person Suresh Varma; 16.01.2011
comment
@hAPPY iCODER - о, нет. Это для нарезки UIImage, будь то myImage.png или [email protected]. - person Dave DeLong; 16.01.2011
comment
Я написал код для нарезки ... но мне нужен фрагмент изображения 2x, который соответствует экрану, как если бы он соответствовал обычным изображениям. Прямо сейчас нарезка 2x делает плитку намного больше, что приводит к выходу за пределы экрана - person Suresh Varma; 16.01.2011