растянуть изображение, как Android девять патч? - PullRequest
12 голосов
/ 25 октября 2011

UIImage Метод:

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight.

Здесь растягиваемая область должна иметь высоту / ширину в один пиксель.

Я не могу установитьрастягиваемая область, поэтому я хочу знать: есть ли категория UIImage для этого?

После того, как я погуглил, я нашел библиотеку.

Вопрос: Есть ли для iPhone загрузчик с девятью патчами?

Объявление: http://blog.tortuga22.com/2010/05/31/announcing-tortuga-22-ninepatch/

http://i.stack.imgur.com/Rc6my.png

Это исходное фотои я хочу растянуть внутренний серый прямоугольник.

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

Ответы [ 5 ]

19 голосов
/ 11 октября 2012

Одним из способов достижения этого является использование приведенного ниже подхода,

UIImage * backgroundImg = [UIImage imageNamed:@"bg.png"];

backgroundImg = [backgroundImg resizableImageWithCapInsets:UIEdgeInsetsMake(2,2, 2, 2)];

[imgView setImage: backgroundImg];

UIEdgeInsetsMake (2,2, 2, 2) - это количество пикселей, которые вы хотите растянуть.

4 голосов
/ 26 декабря 2012

Вы можете получить девять патчей с программным обеспечением Tortuga22

Вы можете найти источник из этого GitHub здесь

Используйте это так

[btnSubmit setImage: [TUNinePatchCache imageOfSize:[btnSubmit bounds].size 
                                forNinePatchNamed:@"imgNormalBackground"]
                       forControlState:UIControlStateNormal];
2 голосов
/ 28 ноября 2011

Начиная с iOS5, вы можете использовать resizableImageWithCapInsets: для достижения этой цели.

1 голос
/ 10 сентября 2013

Я не хотел загружать столько кода для простых 9 патчей, которые у нас были. Так или иначе, вот простое решение проблемы для заинтересованных. Он несколько жестко запрограммирован для наших областей растяжения в 3 пикселя, но вы можете легко настроить их в соответствии с вашими потребностями или найти их на изображении с помощью некоторого базового кода и использовать его вместо моих жестко закодированных параметров вставки.

+ (UIImage *) makeNinePatchImage:(UIImage *)image;
{
    //Clear the black 9patch regions
    CGRect imageRect = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    UIGraphicsBeginImageContextWithOptions(image.size, NO, [UIScreen mainScreen].scale);
    [image drawInRect:imageRect];

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextClearRect(context, CGRectMake(0, 0, image.size.width, 1));
    CGContextClearRect(context, CGRectMake(0, 0, 1, image.size.height));

    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIEdgeInsets insets;

    //hard coded for now, could easily read the black regions if necessary
    insets.left = insets.right = image.size.width / 2 - 1;
    insets.top = insets.bottom = image.size.height / 2 - 1;

    UIImage *nineImage = [image resizableImageWithCapInsets:insets     
                          resizingMode:UIImageResizingModeStretch];

    return nineImage;

}

Затем, чтобы использовать его, скажем, как фон кнопки, просто назовите его так:

[self.dummyButton setBackgroundImage:[EVUtility makeNinePatchImage:learnMoreImage] forState:UIControlStateNormal];

Готово.

0 голосов
/ 27 октября 2011

Если я правильно понимаю, вы хотите, чтобы прямоугольник увеличивался в длину и в высоту. Хотя могут быть более эффективные решения, я могу предложить разбить границу на базовую единицу. Добавляйте это изображение несколько раз друг за другом, чтобы сформировать прямоугольник границы желаемой длины и высоты. Затем закрасьте внутренний прямоугольник серым цветом.

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