UIImage resizableImageWithCapInsets: не работает как ожидалось
Я пишу свое первое приложение для iOS, ориентированное на платформу iOS 5.0+. Я использую протокол UIAppearance
для настройки пользовательского интерфейса приложений.
Я пытаюсь изменить фон для UIBarButtonItem
для всего приложения. Из-за того, что мой UIBarButtonItem
может изменять размер в зависимости от используемого текста или значка, я пытаюсь использовать UIImage resizableImageWithCapInsets:
с моим фоном png.
Я изначально нашел код, который мне нужен на Ray Wenderlich. Используя тот же самый точный код, с изображением, которое довольно близко к тому, которое используется в вышеупомянутом учебнике, я получаю странные результаты. Может быть, это просто моя неопытность с помощью Cocoa Touch.
Вот код, который я использую.
DreamsAppDelegate.m - customizeAppearance:
UIImage *btnBg = [[UIImage imageNamed:@"navBarButton-bg"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 6, 0, 6)];
[[UIBarButtonItem appearance] setBackgroundImage:btnBg
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
Вот фоновое изображение png, которое я пытаюсь использовать
![png background]()
И вот результат (в симуляторе)
![result of trying to use resizableImageWithCapInsets:]()
Ответы
Ответ 1
Раздел вашего изображения между left
и right
, а также между top
и bottom
, чередуется, чтобы заполнить пространство, необходимое для изображения. Попробуйте UIEdgeInsetsMake(15, 6, 15, 6)
.
Чтобы обобщить, если ваше изображение имеет непрерывный градиент, повторяющийся раздел должен быть только 1 пиксель. Так как ваше изображение кнопки высотой 31 пиксель, top
и bottom
(первый и третий аргументы UIEdgeInsetsMake
) должны быть добавлены к 30. Они не должны быть равными; UIEdgeInsetsMake(8, 6, 22, 6)
переместит повторную секцию вверх, в результате получится более бледный фон.
Кроме того, есть ли файл, на который вы прикрепляете изображение или изображение сетчатки ('@2x')? Вставки должны быть в размере простой версии.
Ответ 2
У меня есть одна и та же проблема.
Еще одна вещь, которую вы можете сделать, - установить параметр resizingMode UIImageResizingModeStretch. Он решил мою проблему.
В любом случае, он недоступен в IOS5. Поэтому мое решение будет состоять в том, чтобы все, что говорили все. Поймите, что черепичная сторона должна быть всего одним пикселем. Большинство кнопок в любом случае не сильно меняются.
Итак, используйте этот код:
-(UIImage *) resizableImageWithCapInsets2: (UIEdgeInsets) inset
{
if ([self respondsToSelector:@selector(resizableImageWithCapInsets:resizingMode:)])
{
return [self resizableImageWithCapInsets:inset resizingMode:UIImageResizingModeStretch];
}
else
{
float left = (self.size.width-2)/2;//The middle points rarely vary anyway
float top = (self.size.height-2)/2;
return [self stretchableImageWithLeftCapWidth:left topCapHeight:top];
}
}