Retina-дисплей изображений-iPhone 3 до 4 - PullRequest
0 голосов
/ 15 января 2011

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

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

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

Любая помощь будет очень признательна.

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

Ответы [ 2 ]

1 голос
/ 15 января 2011

Вероятно, проблема заключается в том, что масштаб изображения @ 2x автоматически устанавливается правильно только для определенных инициализаторов UIImage ... Попробуйте загрузить 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);

0 голосов
/ 15 января 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] для определения размера прямоугольника, который вы должны разрезать.

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