2012-04-25 2 views
13

Я пишу свое первое приложение для iOS, ориентированное на платформу iOS 5.0+. Я использую протокол UIAppearance для настройки пользовательского интерфейса приложений.UIImage resizableImageWithCapInsets: не работает как ожидалось

Я пытаюсь изменить фон для 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:

ответ

19

Раздел вашего изображения между left и right, а также между top и bottom, выгравирован для заполнения пространства, необходимого для изображения. Попробуйте UIEdgeInsetsMake(15, 6, 15, 6).

Чтобы обобщить, если ваше изображение имеет непрерывный градиент, повторяющийся участок должен быть только 1 пиксель. Так как ваше изображение кнопки имеет высоту 31 пиксель, то top и bottom (первый и третий аргументы UIEdgeInsetsMake) должны быть добавлены к 30. Они не обязательно должны быть равны; UIEdgeInsetsMake(8, 6, 22, 6) переместит повторяющийся фрагмент вверх, что приведет к более бледному фону.

Кроме того, это файл, на котором вы прикрепляете изображение или изображение сетчатки ('@ 2x')? Вставки должны быть в размере простой версии.

+0

Спасибо за ваш ответ. Опубликованное изображение - @ 2x. Поэтому я должен отрезать мне измерения до (0, 3, 0, 3)? Вы говорите, что я должен сделать середину моего изображения шириной 1px? Я понимаю, почему это было так, но в учебнике, которое я получил, было изображение размером 30 пикселей по 40 пикселей, с тем же градиентом стиля, что и я, и, похоже, он работает фантастично (с использованием UIEdgeInsetsMake, который я сейчас использую, только что отрегулированный пикселем из-за моих угловых радиусов). –

+0

Вот трюк: вы можете использовать 0 для верхнего и нижнего _if_, ваше фоновое изображение имеет ту же высоту, что и кнопка на панели навигации.Он просто заполняет это пространство вашим существующим градиентом. Ваше изображение не является высотой навигационной кнопки сетчатки, поэтому она будет растянута или повторена для заполнения этой высоты. Вы должны указать верхний и нижний размер кепки (первый и третий аргументы). Начните с '(7, 3, 7, 3)'. Это оставит некоторые полосы, но, надеюсь, даст более четкое представление о том, что происходит. – Dondragmer

+0

Ahh, что делает немного больше смысла. Каков размер кнопки retina navBar? Я нарезаю элементы своего пользовательского интерфейса из файла PSD размером с сетчатку, поэтому, если мне нужно сделать кнопку navBar bg больше в файле psd и экспортировать ее, чтобы получить то, что мне нужно, это облегчит мне работу. –

17

У меня такая же проблема.

Еще одна вещь, которую вы можете сделать, - установить параметр resizingMode UIImageResizingModeStretch. Это решило мою проблему.

Hopwever, он недоступен в 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]; 
     } 
    } 
+3

Спасибо, что нашли время ответить на этот вопрос, даже если это более старая должность. Очень признателен! –

+1

Другие ответы на самом деле не решают проблему. Благодарю. –

+1

Спасибо! Отлично работает для меня. –

Смежные вопросы