iPhone: лучший способ обработки 400 UILabels в UIScrollview

Я некоторое время работал над приложением для кроссвордов. Реальная игра работает в UIScrollview, потому что игрок должен иметь возможность прокручивать, масштабировать и панорамировать.

В UIScrollview я добавил UITapGestureRecognizer, который обрабатывает событие касания и вычисляет, где коснулся игрок. Все идет нормально.

После этого я добавил около 400 UILabels в UIScrollview. Каждый из них «пустой», пока игрок не нажмет кнопку на клавиатуре. Моя проблема в том, что когда я добавляю эти метки, весь UIScrollview становится очень медленным и отстает при прокрутке и т. д.

Когда пользователь угадывает правильные слова, становятся видны зеленые плитки. Плитки загружаются как UIImageViews. Это снова снижает производительность.

Я посмотрел на DTGridView, но мне с ним не повезло.

Не могли бы вы помочь мне и попытаться направить меня в правильном направлении?


person Sebastian Søndergaard    schedule 17.04.2012    source источник
comment
UIKit не предназначен для работы в подобных сценариях, вам следует попробовать либо Core Graphics, либо движок на основе OpenGL.   -  person EmilioPelaez    schedule 18.04.2012


Ответы (3)


я думаю, вы должны реализовать метод UIScrollview drawRect самостоятельно вместо того, чтобы добавлять в него 400 UILabel

вы можете установить NSArray, содержащий 400 объектов, называемых «метками»;

когда пользователь нажал кнопку, вы должны вычислить положение и проверить «метку» и решить, какая «метка» должна отображаться в прокрутке при текущем смещении.

добавление 400 UILabels в один UIScrollview может вызвать проблемы с памятью;

person adali    schedule 18.04.2012
comment
Можете ли вы привести пример или направить меня к какому-то учебнику? :) - person Sebastian Søndergaard; 18.04.2012
comment
Я просматриваю вашу задачу и догадываюсь, что вы хотите создать головоломку 20 x 20? так что это проще сделать, реализуйте метод drawRect и рисуйте каждую плитку, которая вам нужна, и определяйте статус каждой плитки, но я думаю, что вы должны сначала знать, как настраивать пользовательский интерфейс UIView через рисовать прямоугольник - person adali; 18.04.2012
comment
Это подход, который я бы использовал. Большое количество подпредставлений всегда плохо сказывается на производительности, с помощью drawRect можно рисовать текст и графику прямо в представлении. - person Wolfgang Schreurs; 18.04.2012
comment
Значит, метод drawRect повысит производительность? :) А как насчет UIImageViews? Они тоже снижают производительность или это только UILabels? И как время от времени перерисовывать некоторые элементы? я хочу изменить текст на некоторых плитках и т. д. Можете ли вы предоставить пример кода? :) - person Sebastian Søndergaard; 18.04.2012
comment
Я пытался прочитать о drawRect, но не могу понять, как его использовать. Если хотите, я могу загрузить изображение игры, и, возможно, вы могли бы попытаться помочь мне, чтобы я мог сделать это более эффективно и не снижать производительность. Спасибо за помощь до сих пор :) - person Sebastian Søndergaard; 18.04.2012

Вам нужно использовать переработанную этикетку в вашем прокрутке. Это улучшит производительность. Чтобы узнать, как повторно использовать/перерабатывать подпредставления в UIScrollView, просмотрите видеоролики Apple WWDC на UIScrollView. Пример кода WWDC 2010 . Также проверьте справку по классу UIScrollView справочник по классу UIScrollView

Вы можете получить помощь по этой ссылке Creating Circular and Infinite UIScrollView

person Walid Hossain    schedule 18.04.2012

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

Я помню, как кто-то сказал, что layoutSubviews замедляет работу, когда вы добавляетеSubviews, поэтому я убрал оттуда свой «локальный» код. Но ничего не ускорилось.

Поэтому при использовании точки останова во время моей процедуры addSubview я заметил, что система iOS на самом деле находилась в вызовах макета суперпредставления (navigationCtrlr) во время viewDidLoad.

Я ввел задержку в 0,1 секунды перед добавлением подзаголовков и бац! Я рекомендую dispatch_async для предотвращения сбоев из-за условий гонки, но это уже другая тема.

Короче говоря, он может быть в LayoutSubviews, даже если вам кажется, что вы там не находитесь.

person Stephen J    schedule 09.08.2016