растянуть изображение как андроид девяти патч?

UIImage Метод:

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

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

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

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

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

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

https://i.sstatic.net/Rc6my.png

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

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


person guoxj    schedule 25.10.2011    source источник
comment
Почему вы не используете загрузчик с девятью патчами для iphone   -  person Manali    schedule 25.10.2011
comment
может быть лучшее решение, например категория uiimage, например: - (UIImage *) imageWithStretchableRect: (CGRect) rect destRect: (CGRect) destRect   -  person guoxj    schedule 26.10.2011
comment
Я использую эту библиотеку, и эффект - не то, что мне нужно. Я хочу повторить какую-то часть изображения.   -  person guoxj    schedule 26.10.2011


Ответы (5)


Один из способов добиться этого - использовать следующий подход:

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

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

[imgView setImage: backgroundImg];

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

person aToz    schedule 11.10.2012

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

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

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

[btnSubmit setImage: [TUNinePatchCache imageOfSize:[btnSubmit bounds].size 
                                forNinePatchNamed:@"imgNormalBackground"]
                       forControlState:UIControlStateNormal];
person Azhar    schedule 26.12.2012

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

person jrturton    schedule 28.11.2011

Я не хотел загружать так много кода для простых изображений с 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];

Сделанный.

person Joel Teply    schedule 09.09.2013

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

person Manali    schedule 27.10.2011
comment
да, именно так. Я просто хочу повторить только часть изображения stackoverflow.com/questions/7901059/ спасибо за ответ. твой ответ мне помог - person guoxj; 29.10.2011