Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Xavier
in god we trust
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
1

UIBezierPath vs UIView

21.01.2014, 01:11. Просмотров 1193. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток! Мне нужен ваш совет по поводу отрисовки в UIVIew.

У меня следующая ситуация:
Есть мой кастомный класс MyView наследник UIView в нем собственно происходят все события.
В этом классе в методе drawRect я отрисовываю сетку (линии сетки представляют из себя тонкие bezierPathWithRect).

Далее мне надо по мере работы моего приложения добавлять кружочки небольшого диаметра, в методе drawRect:
Objective-C
1
UIBezierPath *ovalPath=[UIBezierPath bezierPathWithOvalInRect:rect_];
Количество кружочков со временем работы будет расти до не известного мне количества, может до 10, а может и до 1000.
И у меня возникла проблема в том что по мере добавления кружков мне все их надо отрисовывать т.е. загонять все
UIBezierPath *ovalPath в массив и при вызове drawRect их все рисовать заново, потому что при отрисовке только одного нового кружка все старые удаляются.
Я начал думать, а если у меня будут 1000, а может и 10000 кружков не будет ли это накладно их все заново перерисовывать каждый раз когда создается новый кружок. Я подумывал о setNeedsDisplayInRect, но это тож не вариант т.к. кружки могут пересекаться.

Потом я подумал, а может использовать UIView для кружков и добалять их как subview для главного моего view:
Objective-C
1
2
3
self.circleView = [[UIView alloc] initWithFrame:CGRectMake(x,y,10,10)];
self.circleView.layer.cornerRadius = 5;
[myView addSubview:circleView];
Тогда я выигрываю как мне кажется в том что я разгружаю графическую систему, мне не приходится перерисовывать все кружки каждый раз в drawRect. Но при этом со временем я думаю будет расти использование оперативной памяти, т.к. наверно добавление 1000 subview скушает не мало памяти.

Так вот собственно хочу попросить ваш совет. Как мне лучше поступить? Рисовать 1000 UIbezierPath в drawRect или добавлять 1000 UIview как subview? Что менее затратно для системы и что меньше будет влиять на производительность? Или может существует вообще другое решение для моей ситуации? Может тут вообще все гораздо проще а себе усложнил задачу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2014, 01:11
Ответы с готовыми решениями:

Анимация UIView
Есть 3 view, которые лежат друг на друге вот так: |------------------| | 1...

UIView с PageController
Здравствуйте! Может кто подсказать в чем проблема, хочу сделать UIView с...

Constraints и размер UIView
У меня, допустим, есть UIView добавленная на родительскую View и к ней...

Прижать UIView к низу
Подскажите как в коде прижать UIView к низу родительской вьюшки?

Рекурсивное создание UIView
Здравствуйте! Подскажите как сделать рекурсивное создание 15 UIView, каждая...

4
noname_club
106 / 97 / 12
Регистрация: 01.05.2013
Сообщений: 603
21.01.2014, 12:17 2
Количество кружочков со временем работы будет расти до не известного мне количества, может до 10, а может и до 1000.
Cocos2d ?
1
mobidevelop
182 / 182 / 3
Регистрация: 10.01.2013
Сообщений: 596
21.01.2014, 12:38 3
Второй вариант, ИМХО, лучше. Только добавлять надо не subviews, а sublayers (CALayer). Но для точного ответа надо в инструментах смотреть, предварительно добавив 10000 объектов.
1
Xavier
in god we trust
74 / 74 / 8
Регистрация: 20.04.2012
Сообщений: 201
21.01.2014, 15:53  [ТС] 4
Цитата Сообщение от noname_club Посмотреть сообщение
Cocos2d ?
Как то не думал, это не игра и там помимо рисования кружков будут вестись расчеты и как мне кажется обязательное обновление и перересовка экрана ~60 раз в секунду это лишняя работа (там же это вроде нельзя отключить, могу ошибаться с коксом не знаком детально). Да и в любом случае мне все перерисовывать надо.

Цитата Сообщение от mobidevelop Посмотреть сообщение
Второй вариант, ИМХО, лучше. Только добавлять надо не subviews, а sublayers (CALayer). Но для точного ответа надо в инструментах смотреть, предварительно добавив 10000 объектов.
Спасибо за совет попробую такой вариант. Посмотрю что получится.
0
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
21.01.2014, 19:33 5
Цитата Сообщение от Xavier Посмотреть сообщение
Я подумывал о setNeedsDisplayInRect, но это тож не вариант т.к. кружки могут пересекаться.
Можно попробовать и такой вариант. Найти круги, которые попадают в рект не проблема, перерисовывать можно только их.
0
21.01.2014, 19:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2014, 19:33

Изменить содержимое UIView сдвигом
Добрый день. Проблема в следующем: в методе viewDidLoad основного...

Вращение UIView по типу часовой стрелки
Всем доброго времени суток, собственно есть задача иммитировать часы,...

Size Classes и свойства frame/bounds у UIView
Всем привет! Решил в своем pet-проекте заюзать по-полной size classes, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru