Подтвердить что ты не робот

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:

4b9b3361

Ответ 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];
        }
    }