реализация растягиваемых границ диалога в iphone SDK - PullRequest
1 голос
/ 19 мая 2010

Я хочу реализовать диалоговые границы, которые масштабируются до размера, который требуется для диалога. Возможно, есть более подходящее название для такого рода вещей. Если есть, если кто-то отредактирует заголовок, это было бы здорово.

Как бы то ни было, я бы хотел сделать это, чтобы у меня были диалоговые окна любого размера без визуальных артефактов, которые приводят к масштабированию границы для маленьких, больших или дурацких непропорциональных размеров. У меня есть несколько идей о том, как это сделать, но я не уверен, что лучше для iphone. У меня есть несколько вопросов.

1) Должен ли я создать содержащий объект представления, который в основном перегружает его метод drawRect и рисует изображения там, где они должны быть в их соответствующем масштабе, когда вызывается метод, или я должен обслуживать содержащий объект представления, который просто содержит 8 UIImageViews? Я подозреваю, что последний подход не будет работать, если мне нужно будет активно масштабировать полученный класс диалога, как в анимации.

1b) Если стоит перегрузить drawRect, есть ли у кого-нибудь пример кода или ссылка на пример, демонстрирующий рисование изображения непосредственно из drawRect ()?

2) Как правило, лучше создать

a) изображение 3 x 3, где сегменты находятся в соответствующей сетке изображения 1x1? Если это так, то просто ли нарисовать часть этого изображения в моем целевом представлении в drawRect (если предыдущее предположение верно, что я должен использовать drawRect)?

б) Части отдельно в 8 разных файлах?

UPDATE: Чтобы уточнить, идея состоит в том, чтобы взять любое настроенное оформление границ и иметь возможность растянуть 2-ю, 4-ю, 6-ю и 8-ю ячейку (в сетке 3х3 ячейки), чтобы сформировать границу любого размера только с этими активами. Растягивание простого изображения может привести к искажению углов, поэтому я бы хотел растянуть эти четные ячейки по мере необходимости и прикрепить углы, чтобы не было искажений. Я видел, как это было сделано раньше, поэтому думал, что это может быть стандартная вещь и иметь стандартное именование, отличное от того, что я назвал.

Во всяком случае, мне сообщили, что добавление 8 UIImageViews в контейнер не будет столь же эффективным, как рисование UIImages на лету в drawRect, поэтому применил этот подход с использованием CGContextDrawImage () после применения необходимых преобразований к контексту для перевода и масштабирования Y. Поскольку эта функция рисует из нижнего левого угла изображения, но в верхний левый исходный UIView, изображение переворачивается без инверсии оси Y. Я заметил предложение использовать функции UIImage, такие как drawAtPoint, работает также и аналогично, но для инвертирования, поскольку UIImage рисует в той же ориентации, что и UIViews. Я продолжу свою реализацию с первым и посмотрю, как это будет, но еще один вопрос.

Кто-нибудь случайно узнает, какой из этих подходов эффективнее, быстрее и т. Д.

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

Я не уверен, что следую, но вот мой лучший шанс на ответ ...

Использование drawRect: или добавление отдельных UIImageViews в родительское представление полностью зависит от вас. UIImageView предоставляет вам немного инкапсулированных функций бесплатно, но в остальном они такие же, как и внешний вид.

Если вы хотите пойти по маршруту drawRect, вам просто нужно использовать метод drawAtPoint: UIImage. Сделайте математику там, где вы хотите, и нарисуйте ее. Вы можете рассчитать свои очки на основе размеров родительского вида.

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

Надеюсь, это немного поможет?

Приветствия

1 голос
/ 19 мая 2010

Если вы хотите, чтобы в диалоговом окне была граница, предполагая, что это UIView (или подкласс), то установите свойства границ слоя и позвольте системе нарисовать для вас границу.

#import <QuartzCore/QuartzCore.h> 
// ... 

view.layer.borderWidth = 2;
view.layer.borderColor = [UIColor whiteColor].CGColor; 
view.layer.cornerRadius = 0;  // 0=square corners, >0 for rounded
...