Как сделать ui отзывчивым все время и делать обновление фона?
Я создаю приложение, которое отображает 8 эскизов на страницу и может иметь n страниц. Каждый из этих миниатюр является UIViews и добавляется в UIScrollView. Однако я использовал пейджинг, используя образец кода Apple.
Задача:
- Каждый эскиз (UIView) занимает 150 миллисекунд, которые нужно создать и добавить в список прокрутки
- Следовательно, для 3 страниц требуется огромное количество времени, которое нужно создать и добавить в список прокрутки пользовательского интерфейса.
- На данный момент вид прокрутки не очень отчетливый, и он очень рывкий и дает плохой пользовательский интерфейс
- Как я могу создать эскизы и добавить их в UIScrollview, не затрагивая чувствительность к касанию? Я хочу, чтобы они запускались независимо от основного streamа, который можно использовать для обработки событий касания (я полагаю).
Также я хотел бы упомянуть, что когда создается миниатюра, я запускаю загрузку Async изображения, и метод делегата вызывается, когда загрузка завершена.
- Полужирный и нежирный текст в одном UILabel?
- UIPopoverPresentationController на iOS 8 iPhone
- Сколько стоит разработка приложения для iPhone?
- Как написать таймер в Objective-C?
- Множественное перечисление значений в Obj-C
Дайте мне знать варианты, которые я должен сделать, чтобы сделать это более отзывчивым и обновить интерфейс, не затрагивая операции касания. Управление страницей отлично работает с ленивой загрузкой сетки эскизов.
ТИА,
Praveen S
- Как отобразить изображение base64 в UIImageView?
- Создание UIImage в форме круга
- UIScrollView: подкачка по горизонтали, прокрутка по вертикали?
- Создание пользовательского UIKeyBoard для iPhone
- NSMutableString как сохранить / скопировать
- Программно включить Bluetooth в iphone sdk?
- API, чтобы определить, работает ли на iPhone или iPad
- UISlider для управления AVAudioPlayer
Grand Central Dispatch прост в использовании для загрузки фона. Но GCD только для iOS4. Если вам нужно поддерживать iOS3, то полезно использовать функцииSelectorInBackground / performSelectorOnMainThread или NSOperationQueue.
И, будьте осторожны, почти classы UIKit не являются streamобезопасными, за исключением рисования в графическом контексте. Например, UIScrollView не является streamобезопасным, UIImage imageNamed: не является streamобезопасным, но UIImage imageWithContentsOfFile: поточно-безопасный.
dispatch_queue_t mainQueue = dispatch_get_main_queue(); dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(concurrentQueue, ^{ dispatch_apply([thumbnails count], concurrentQueue, ^(size_t index) { Thumbnail *thumbnail = [thumbnails objectAtIndex:index]; thumbnail.image = [UIImage imageWithContentsOfFile:thumbnail.url]; dispatch_sync(mainQueue, ^{ /* update UIScrollView using thumbnail. It is safe because this block is on main thread. */ }); } /* dispatch_apply waits until all blocks are done */ dispatch_async(mainQueue, ^{ /* do for all done. */ }); }
У меня была аналогичная проблема.
То, что я сделал, было в экземпляре, я сохранил только 3 страницы в памяти и очистил оставшиеся все.
Если предполагается наличие 3 экранов s1, s2, s3. И пользователь просматривает s2. Всякий раз, когда он прокручивается до s3, я удаляю s1 и загружаю новую страницу s4.
Чтобы пользователи имели лучший опыт. И меньше памяти будет занято.
Независимо от того, используете ли вы просмотр или отдельный ViewController для каждой «страницы» или элемента Scrollview, может возникнуть резкость или низкая производительность, изменив расположение вашего кода.
В частности, код примера apple для scrollview с pagecontrol имеет что-то вроде этого:
[self loadScrollViewWithPage:page - 1]; [self loadScrollViewWithPage:page]; [self loadScrollViewWithPage:page + 1];
Однако этот код появляется в своем примере в методе «scrollViewDidScroll». Он пытается сделать многократный тяжелый подъем одновременно и прокруткой, и загрузкой. Даже если ваши изображения являются локальными, это неприятно.
Если вы переместите этот и связанный с ним код, включая ссылку на текущую страницу, на «scrollViewDideEndDecelerating», то раздражение интерфейса будет устранено, потому что загрузка происходит, когда scrollview больше не перемещается.