Есть ли 9-патч-загрузчик для iPhone?
Android имеет приятный способ определения растягиваемых изображений, называемых девятью патчами. См. эти документы для описания концепции. Идея состоит в том, чтобы окружить png-изображение с помощью 1-пиксельной границы, где вы можете определить растяжимые области и размеры заполнения изображения. Это абсолютно блестяще, и я хотел бы использовать эту идею в своем приложении для iPhone. Прежде чем писать свой собственный 9-патч для загрузчика UIImage, я подумал, что увижу, если он уже существует. Google не возвращает никаких результатов, поэтому у меня нет большой надежды, но не больно спрашивать, верно?: -)
EDIT: Люди, я ценю ответы, но знаю о stretchableImageWithLeftCapWidth...
. Я ищу код, который принимает путь @"foo.9.png"
и возвращает растяжимый UIImage
. Этот код, без сомнения, будет использовать stretchableImageWithLeftCapWidth...
внутренне. Я уверен, что сам мог бы написать код, используя этот метод. Но я прошу, если кто-то еще это сделал.
Ответы
Ответ 1
Я получил электронное письмо от программного обеспечения Tortuga22, которое сообщило мне, что они создали такую библиотеку и выпустили ее под лицензией Apache:
Объявление: http://blog.tortuga22.com/2010/05/31/announcing-tortuga-22-ninepatch/
Исходный код: http://github.com/tortuga22/Tortuga22-NinePatch
Пример использования:
// loads-and-caches ninepatch and rendered image of requested size
UIImage buttonImg = [TUNinePatchCache imageOfSize:buttonSize
forNinePatchNamed:@"buttonNormalBackground"];
[self.buttonNeedingBackground setImage:buttonImg
forControlState:UIControlStateNormal];
Ответ 2
Также посмотрите свойство UIView contentStretch. Он более надежный и хорошо управляемый, чем растяжимыйImageWithLeftCapWidth. В принципе, он работает, просто определяя растяжимый прямоугольник в вашем изображении и автоматически создавая масштабированный девятипакет. Этот внутренний прямоугольник может быть любым - он даже не должен находиться в центре изображения. Плюс в отличие от stretchableImage, этот метод будет правильно сокращать графику и вести себя так, как ожидалось, для графики с подсветкой или блеском. Я не могу думать о каком-либо реальном приложении, где вы хотели бы больше этого.
Ответ 3
Да UIImage
поддерживает что-то подобное. См.
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight
и документация для leftCapWidth и topCapHeight
в основном изображение не растягивается в области leftCapWidth пикселей слева и справа края и topCapHeight пикселей сверху и снизу. Когда изображение масштабируется, область внутри этих границ подвержена растяжению.
Ответ 4
Все UIImage
изображения поддерживают это изначально. По умолчанию все изображения можно растягивать, но вы можете устанавливать шапки с помощью свойств leftCapWidth
и topCapHeight
или вы можете сгенерировать их из существующего UIImage
с помощью метода - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight
.
Обратите внимание, что в реализации apple, когда вы устанавливаете одно или оба из этих значений, растягиваемая область вынуждена быть одним пикселом высокого/широкого диапазона.