0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 4
|
|
1 | |
Написать собственную таблицу (упрощенный аналог UITableView) использую UIScrollView12.10.2020, 23:03. Показов 2591. Ответов 4
Метки нет (Все метки)
Большая таблица
Предпосылки UIKit содержит таблицу UITableView. Это очень удобный компонент для построения интерфейсов. К сожалению, он не справляется с большим количеством ячеек. Исходные данные Приложение содержит два экрана. Первый создан для отладки. На нём посередине экрана помещена таблица с рамкой. В таблице должны быть показаны 50 ячеек. На втором экране таблица занимает всё пространство. В таблице должен быть показан триллион ячеек. Задание Основное: В проекте есть класс TableView. Необходимо добавить имплементацию, не меняя публичного интерфейса. Таблица должна показывать ячейки класса TableCell. Высота каждой ячейки - 40, ширина совпадает с шириной таблицы. Дополнительные: Поддержать переиспользование ранее созданных ячеек. Поддержать поворот телефона, при котором первая видимая ячейка будет сохранять своё положение, относительно верхней границы таблицы. Подсказки 1)Свойство таблицы dataSource будет ненулевым сразу после инициализации таблицы. К нему можно обращаться для того, чтобы узнать какое количесство строк должна отображать таблица, а также какой текст должен быть у каждой ячейки TableCell. 2)Размер таблицы на экране и размер контента, который она отображает это разные вещи. Для модификации размера контента можно использовать свойство contentSize. 3)Каждый объект класса UIView (и подклассы, например наша таблица TableView) удовлетворяют протоколу UICoordinateSpace. В нём содержатся методы для преобразования между разными системам координат. 4)Начните с того, что задайте произвольный большой contentSize своей таблице (например в инициализаторе) и посмотрите на значения bounds и frame в методе layoutSubviews() таблицы при скролле. Обратите внимание когда и как часто вызывается метод layoutSubviews(). Подскажите пожалуйста как это сделать. Не очень понятно как переписать механизм переиспользования уже созданных клеток таблицы
0
|
12.10.2020, 23:03 | |
Ответы с готовыми решениями:
4
Написать упрощенный аналог утилиты tail Упрощенный аналог утилиты paste Упрощенный аналог ngrok - Трех или четырехзвенная архитектура? Как начинать делать многопользовательскую игру? (упрощенный в 100 раз аналог Цивилизации)? |
41 / 28 / 13
Регистрация: 31.10.2019
Сообщений: 126
|
||||||
13.10.2020, 01:38 | 2 | |||||
UITableView сделан так, что он может нарисовать любое количество ячеек. по факту, физически количество ячеек в памяти создается чуть больше, чем умещается в пределах одного экрана. а потом одна и та же ячейка многократно перерисовывается нужным контентом.
для этого у таблицы есть метод dequeueReusableCell https://developer.apple.com/do... usablecell он принимает два параметра 1) строковый идентификатор ячейки 2) текущий indexPath чтобы метод работал, нужно зарегистрировать этот идентификатор. это можно сделать или в IB, или программно при помощи метода register https://developer.apple.com/do... 8-register контроллеру нужно реализовать метод делегата UITableViewDataSource func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell который создаст ячейку в таблице и заполнит ее нужным контентом примерно это выглядит так. нужно помнить, что одна и та же ячейка может многократно переиспользоваться, поэтому метод show() должен полностью перерисовать ее содержимое текущим контентом
1
|
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 4
|
|
13.10.2020, 17:59 [ТС] | 3 |
Проблема в том, что нужно реализовать класс UITableVIew самому (т е создать новый класс TableView который наследуется от UIScrollView)
0
|
41 / 28 / 13
Регистрация: 31.10.2019
Сообщений: 126
|
|
13.10.2020, 18:34 | 4 |
Сообщение было отмечено Megus как решение
Решение
так а в чем проблема сделать так же? у тебя известна высота ячеек, известна высота экрана девайса. исходя из этого вычисляешь количество ячеек в памяти, чтобы они закрыли весь экран + 2 дополнительные (+1 сверху и +1 снизу). зная общее количество отображаемых ячеек, вычисляешь contentSize у UIScrollView. при пролистывании скролла через contentOffset получаешь текущую видимую точку, из нее вычисляешь текущую (indexPath) ячейку и все соседние, которые помещаются на экране. и для отображения конкретной видимой ячейки вычисляешь, какую из заранее созданных (в памяти) нужно взять. чтобы перерисовать на ней весь контент. именно так и сделана стандартная таблица.
1
|
0 / 0 / 0
Регистрация: 01.12.2017
Сообщений: 4
|
|
13.10.2020, 21:16 [ТС] | 5 |
Понял, спасибо
0
|
13.10.2020, 21:16 | |
13.10.2020, 21:16 | |
Помогаю со студенческими работами здесь
5
Реализовать пользовательский класс Pair (упрощённый аналог std::pair) Разработать приложение, имитирующее упрощенный аналог игры "Кто хочет стать миллионером" Поле со ссылкой на собственную таблицу Написать собственную функцию ToLower Написать собственную функцию isalnum Написать собственную реализацию функции copy. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |