Автоизменяемая высота строки в Xamarin.iOS
Предупреждение
Поддержка конструктора iOS была прекращена в Visual Studio 2019 версии 16.8 и Visual Studio 2019 для Mac версии 8.8. В Visual Studio 2019 версии 16.9 и Visual Studio для Mac версии 8.9 этот конструктор удален. Создавать пользовательские интерфейсы iOS рекомендуется непосредственно на Mac с помощью Xcode Interface Builder. Дополнительные сведения см. в статье Проектирование пользовательских интерфейсов с помощью Xcode.
Начиная с iOS 8, Apple добавила возможность создать представление таблицы (UITableView
), которое может автоматически увеличиваться и уменьшать высоту заданной строки на основе размера его содержимого с помощью автоматического макета, классов размера и ограничений.
IOS 11 добавил возможность автоматического расширения строк. Заголовки, нижние колонтитулы и ячейки теперь могут быть автоматически размером на основе их содержимого. Однако если таблица создана в конструкторе iOS, конструкторе интерфейсов или если она имеет фиксированные высоты строк, необходимо вручную включить ячейки самостоятельного изменения размера, как описано в этом руководстве.
Макет ячейки в конструкторе iOS
Откройте раскадровки для представления таблиц, для которого требуется автоматически изменить размер строки в конструкторе iOS, выберите прототип ячейки и создайте макет ячейки. Например:
Для каждого элемента прототипа добавьте ограничения, чтобы сохранить элементы в правильном положении, так как представление таблицы изменяется для поворота или разных размеров экрана устройства iOS. Например, закрепление Title
вверху, слева и справа от представления содержимого ячейки:
В нашем примере таблицы небольшой Label
(в нижней Title
части) — это поле, которое может уменьшать и увеличиваться, чтобы увеличить или уменьшить высоту строки. Чтобы добиться этого эффекта, добавьте следующие ограничения для закрепления левой, правой и нижней части метки:
Теперь, когда элементы в ячейке полностью ограничены, необходимо уточнить, какой элемент следует растянуть. Для этого задайте приоритет обнимания содержимого и приоритет сопротивления сжатия содержимого, как это необходимо в разделе макета панели свойств:
Задайте элемент, который требуется развернуть, чтобы иметь более низкое значение приоритета hugging и более низкое значение приоритета сопротивления сжатия.
Затем необходимо выбрать прототип ячейки и дать ему уникальный идентификатор:
В нашем примере GrowCell
. Мы будем использовать это значение позже при заполнении таблицы.
Внимание
Если таблица содержит несколько типов ячеек (прототип), необходимо убедиться, что каждый тип имеет собственный уникальный для Identifier
автоматического изменения размера строк для работы.
Для каждого элемента нашего прототипа ячейки назначьте имя, чтобы предоставить его коду C#. Например:
Затем добавьте пользовательский класс для UITableViewController
, UITableView
а также UITableCell
(прототип). Например:
Наконец, чтобы убедиться, что все ожидаемое содержимое отображается в нашей метке, задайте для свойства Lines значение 0
:
Определим пользовательский интерфейс, добавим код, чтобы включить автоматическое изменение размера высоты строк.
Включение автоматического изменения размера высоты
В источнике данных () или источнике (UITableViewDatasource
) в представлении таблицы (UITableViewSource
) при отмене ячейки необходимо использовать Identifier
то, что мы определили в конструкторе. Например:
public string CellID {
get { return "GrowCell"; }
}
...
public override UITableViewCell GetCell (UITableView tableView, Foundation.NSIndexPath indexPath)
{
var cell = tableView.DequeueReusableCell (CellID, indexPath) as GrowRowTableCell;
var item = Items [indexPath.Row];
// Setup
cell.Image = UIImage.FromFile(item.ImageName);
cell.Title = item.Title;
cell.Description = item.Description;
return cell;
}
По умолчанию представление таблицы будет задано для автоматического изменения размера высоты строк. Чтобы убедиться в этом, RowHeight
свойство должно иметь значение UITableView.AutomaticDimension
. Нам также нужно задать EstimatedRowHeight
свойство в нашем UITableViewController
. Например:
public override void ViewWillAppear (bool animated)
{
base.ViewWillAppear (animated);
// Initialize table
TableView.DataSource = new GrowRowTableDataSource(this);
TableView.Delegate = new GrowRowTableDelegate (this);
TableView.RowHeight = UITableView.AutomaticDimension;
TableView.EstimatedRowHeight = 40f;
TableView.ReloadData ();
}
Эта оценка не должна быть точной, просто грубой оценкой средней высоты каждой строки в представлении таблицы.
При выполнении этого кода при запуске приложения каждая строка будет уменьшаться и расти на основе высоты последней метки в прототипе ячейки. Например: