9-фрагментное масштабирование / растяжение в фоновом режиме с использованием Cocoa на iOS - PullRequest
5 голосов
/ 17 июня 2011

Я хочу растянуть изображение, используя 9-фрагментное масштабирование, когда масштабируется только центр изображения. Точно так же, как метод UIImage stretchableImageWithLeftCapWidth, однако я хочу сделать это в фоновом потоке. Я понимаю, что этот метод может использоваться только в потоке графического интерфейса.

Я занимаюсь разработкой на iOS / iPad / iPhone.

Кто-нибудь имеет фрагмент кода или знает библиотеку, которая может это сделать? Я пытаюсь не изобретать велосипед!

Некоторые ссылки, которые я нашел полезными:

CGContext документы:

Хорошая запись в блоге по рисованию на заднем плане:

Поворот изображения с помощью CGContext:

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Начиная с iOS 4, некоторые части UIKit являются поточно-ориентированными; Я считаю, что функции UIGraphics и рисование UIImage должны работать.

Если вам нужна поддержка iOS 3, то это немного сложнее. Если вы хотите полностью избежать UIKit (возможно, мудро), тогда вам нужно передать фоновый поток CGImageRef. Есть дополнительные вещи, о которых вам может понадобиться беспокоиться; Я предполагаю, что scale равно 1, а imageOrientation - портрет.

  1. Создать контекст: CGBitmapContextCreate()
  2. Создайте свои подизображения: CGImageCreateWithImageInRect().
  3. Нарисуйте каждое изображение в нужном месте: CGContextDrawImage()
  4. Получить изображение из контекста: CGBitmapContextCreateImage()
  5. Отпустите необходимые вещи и верните CGImageRef в основной поток.
  6. В главном потоке используйте +[UIImage imageWithCGImage:] или +imageWithCGImage:scale:orientation: (обратите внимание, что в последнем случае изображения с масштабом 2, по-видимому, поддерживают только портретную ориентацию; я не уверен почему).

Также обратите внимание, что значительно лучше вставить изображение в UIImageView и соответствующим образом установить contentStretch, поскольку тогда масштабирование выполняется на графическом процессоре.

1 голос
/ 17 июня 2011

AppKit имеет приятную функцию NSDrawNinePartImage().Я нашел этот код в Интернете, и он предоставляет аналогичные функции для iOS.

http://pastie.org/1147077/

//
//  UIImageAdditions.m
//  Newspress
//
//  Created by Kyle Van Essen on 10-04-10.
//  Copyright 2010 Vibealicious. All rights reserved.
//

#import "UIImageAdditions.h"


@implementation UIImage (Additions)

+(void)drawNinePartImage:(NSArray *)images inRect:(CGRect)rect
{
    CGPoint origin = rect.origin;
    CGSize size = rect.size;

    NSInteger partCount = 9;

    if ([images count] < partCount)
        return;

    CGRect rects[partCount];
    UIImage *image;

    // Top Row
    image = [images objectAtIndex:0];
    rects[0] = CGRectMake(origin.x, origin.y, image.size.width, image.size.height);

    image = [images objectAtIndex:2];
    rects[2] = CGRectMake(origin.x + size.width - image.size.width, origin.y, image.size.width, image.size.height);

    image = [images objectAtIndex:1];
    rects[1] = CGRectMake(rects[0].size.width + rects[0].origin.x, origin.y, size.width - rects[0].size.width - rects[2].size.width, image.size.height);

    // Bottom Row
    image = [images objectAtIndex:6];
    rects[6] = CGRectMake(origin.x, origin.y + size.height - image.size.height, image.size.width, image.size.height);

    image = [images objectAtIndex:8];
    rects[8] = CGRectMake(origin.x + size.width - image.size.width, origin.y + size.height - image.size.height, image.size.width, image.size.height);

    image = [images objectAtIndex:7];
    rects[7] = CGRectMake(rects[6].size.width + rects[6].origin.x, origin.y + size.height - image.size.height, size.width - rects[6].size.width - rects[8].size.width, image.size.height);

    // Middle Row
    image = [images objectAtIndex:3];
    rects[3] = CGRectMake(origin.x, origin.y + rects[0].size.height, image.size.width, size.height - rects[0].size.height - rects[6].size.height);

    image = [images objectAtIndex:5];
    rects[5] = CGRectMake(origin.x + size.width - image.size.width, origin.y + rects[0].size.height, image.size.width, size.height - rects[2].size.height - rects[8].size.height);

    image = [images objectAtIndex:4];
    rects[4] = CGRectMake(rects[3].size.width + rects[3].origin.x, origin.y + rects[0].size.height, size.width - rects[0].size.width - rects[2].size.width, size.height - rects[1].size.height - rects[7].size.height);

    for (NSInteger index = 0; index < partCount; index++)
    {               
        UIColor *pattern = [[UIColor alloc] initWithPatternImage:[images objectAtIndex:index]];

        //NSLog(@"Frame: %f, %f, %f, %f", rects[index].origin.x, rects[index].origin.y, rects[index].size.width, rects[index].size.height);

        [pattern set];
        CGContextSetPatternPhase(UIGraphicsGetCurrentContext(), CGSizeMake(rects[index].origin.x, rects[index].origin.y));
        UIRectFill(rects[index]);

        [pattern release];
    }

    [[UIColor clearColor] set];
}

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