2009-04-24 2 views
7

Я пытаюсь изменить размер изображения с помощью stretchableImageWithLeftCapWidth: он работает на симуляторе, но на устройстве появляются вертикальные зеленые полосы.Изменение размера изображения с помощью stretchableImageWithLeftCapWidth

Я попытался использовать imageNamed, imageWithContentOfFile и imageWithData загрузить изображение, оно не меняется.

UIImage *bottomImage = [[UIImage imageWithData: 
    [NSData dataWithContentsOfFile: 
    [NSString stringWithFormat:@"%@/bottom_part.png", 
    [[NSBundle mainBundle] resourcePath]]]] 
     stretchableImageWithLeftCapWidth:27 topCapHeight:9]; 

UIImageView *bottomView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 200+73, 100, 73)]; 
[self.view addSubview:bottomView]; 
UIGraphicsBeginImageContext(CGSizeMake(100, 73)); 
[bottomImage drawInRect:CGRectMake(0, 0, 100, 73)]; 
UIImage *bottomResizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
bottomView.image = bottomResizedImage; 

См. Результат: зеленые стержни не должны быть там, они не отображаются на симуляторе.

alt text http://www.quicksnapper.com/files/5161/96232162149F1C14751048_m.png

ответ

12

Вы поняли это?

Похоже, это может быть ошибка с UIGraphicsGetImageFromCurrentImageContext. Если я рисую изображение с прозрачностью, я получаю красные/зеленые артефакты. Они появляются только на устройстве (не в сим). Кроме того, если я удаляю прозрачность с изображения, артефакты уходят.

Обновление: Еще несколько странностей. Раньше я использовал PNG, поэтому вместо этого попытался использовать прозрачный gif. Используя GIF, показана проблема артефакта на симе.

Победа! Найдено решение:

Отключите «Сжать файлы PNG» в настройках сборки для вашего проекта. Отключение этого делает прозрачность PNG без каких-либо артефактов.

+0

Ничего себе, спасибо. –

5

Похоже, вы пишете много ненужного кода, но, возможно, это только потому, что из контекста и есть больше, что я пропускаю.

Чтобы получить изображение:

[[UIImage imageName: @"bottom_part.png"] stretchableImageWithLeftCapWidth: 27 topCapHeight: 9]; 

Какую часть вашего кода вы отображающие это изображение? то есть в каком вызове метода вы рисуете изображения выше?

Почему бы не просто использовать UIImageView и не поставить изображение там? Тогда вам не нужно делать какой-либо графический контекст и т. Д.

0

Я провел 5 часов отладки этой последней ночью, отключив сжатие PNG в xcode, ничего не сделал для меня.

Для всех, кто встречает вертикальные, зеленые, бары/линии/артефакты с stretchableImageWithLeftCapWidth (в UIImage API) - этот пост для вас.

У меня есть 21x30 для пользовательского фона барной стойки, который я хочу расширить, но получил те же зеленые полосы, что и OP. Я нашел PNG, созданный с помощью фотошопа, и это отлично работало с Gimp. В любом случае, удаление ВСЕХ фрагментов из файлов (кроме трех основных) не имело никакого значения. Также не отключили сжатие PNG.

Что сделал работу для меня это:

  1. Добавьте одну пустую строку выше моего образа (который теперь 21x31).
  2. Set topCapHeight: 0 при создании масштабированного изображения.
  3. Когда я использую свое масштабированное изображение, я рисую CGContext, который позже используется для создания UIImage.Я использую это для рисования: [image drawInRect: CGRectMake (0, -2, width, 32)];

Это заставляет проблему уйти (для меня).

Я предполагаю, что ошибка/проблема связана с не масштабирование по вертикали при рисовании, поэтому я принудительно масштабирую первую линию изображения источника (в две строки), которые вытягиваются вне моей композиции.

Надеюсь, это поможет кому-то сэкономить 5 часов.

/Krisb

1

В моем случае я имел UIImageView, которые я вытянутый по горизонтали. Я нашел странную вертикальную белую линию в растянутом изображении.

Решения, указанные выше, не помогли мне. Однако следующее же:

Cast значение ширины к INT значения:

myNewViewFrame.size.width = (int)newWidth; 
myView.frame = myNewViewFrame; 

Надеется, что это работает для вас, ребят, как хорошо ...

+0

Спасибо Henrik, у меня была точно такая же проблема, и это исправлено. – Echelon

0

я перестал использовать stretchableImageWithLeftCapWidth в пользу UIView гораздо более корректное свойство contentStretch. Я никогда не видел зеленые полосы, которые вы описываете, но в целом я бы рекомендовал использовать contentStretch вместо stretchableImageWithLeftCapWidth.

+0

Как вы получаете endcaps с contentStretch? – Adam

0

Я попытался отключить сжатие PNG, например, Nate, но это не сработает для меня (iOS 3.1.3). Затем я попытался использовать TIFF-изображения вместо PNG, который работает.

0

Я нашел похожие проблемы с contentStretch (на любом UIView, который нарисовал контент) при использовании значения (0,5, 0,5, 0, 0). то есть растягивать на центральном пикселе.

Я обнаружил, что проблема связана только с iphone 3G (возможно, 2G). iphone 4 и 3GS в порядке. Итак, я предполагаю, что это проблема со старой графикой HW.

способ, которым я нашел вокруг проблемы, состоял в том, чтобы растянуть на несколько большую центральную область.

например. (0,4, 0,4, 0,1, 0,1)

+0

Заметьте, я согласен и вижу эти проблемы, происходящие на 3g, но не 3gs и 4 – yeahdixon

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