Как добавить интервал между UITableViewCell - PullRequest
150 голосов
/ 02 июня 2011

Есть ли способ добавить интервал между UITableViewCell?

Я создал таблицу, и каждая ячейка содержит только изображение. Изображение присваивается ячейке следующим образом:

cell.imageView.image = [myImages objectAtIndex:indexPath.row];

но это делает изображение увеличенным и вписывается во всю ячейку, и между изображениями нет промежутков.

Или, скажем так, высота изображения, например, 50, и я хочу добавить 20 интервалов между изображениями. Есть ли способ сделать это?

Ответы [ 22 ]

3 голосов
/ 14 сентября 2016

Да, вы можете увеличить или уменьшить интервал (заполнение) между двумя ячейками, создав одно базовое представление для представления содержимого в ячейке. Установите прозрачный цвет для фона представления содержимого, и вы можете отрегулировать высоту базового представления, чтобы создать пространство между ячейками.

3 голосов
/ 02 июня 2011

Три подхода, которые я могу придумать:

  1. Создайте пользовательскую ячейку таблицы, которая отображает вид всей ячейки так, как вы хотите

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

  3. Я хочу предложить вам манипулировать UIImageView напрямую, чтобы установить фиксированный размер / заполнение, но я далеко не Xcode, поэтому я не могу подтвердить, будет ли / как это работать.

Имеет ли это смысл?

1 голос
/ 07 июля 2016

Я думаю, что это самое чистое решение:

class MyTableViewCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
        layoutMargins = UIEdgeInsetsMake(8, 0, 8, 0)
    }
}
1 голос
/ 07 июня 2018

Основано на ответе Хусама: использование слоя ячеек вместо представления содержимого позволяет при необходимости добавлять границы вокруг всей ячейки и аксессуара. Этот метод требует тщательной корректировки нижних ограничений ячейки, а также вставок, в противном случае вид не будет правильным.

@implementation TableViewCell

- (void)awakeFromNib { 
    ... 
}

- (void) layoutSubviews {
    [super layoutSubviews];

    CGRect newFrame = UIEdgeInsetsInsetRect(self.layer.frame, UIEdgeInsetsMake(4, 0, 4, 0));
    self.layer.frame = newFrame;
}

@end
1 голос
/ 21 февраля 2018

Эта статья помогла, это почти то же, что и в других ответах, но кратко и кратко

https://medium.com/@andersongusmao/left-and-right-margins-on-uitableviewcell-595f0ba5f5e6

В нем он применяет их только к левой и правой сторонам, но инициализация UIEdgeInsetsMake позволяет добавить отступы ко всем четырем точкам.

func UIEdgeInsetsMake (_ вверху: CGFloat, _ слева: CGFloat, _ внизу: CGFloat, _ справа: CGFloat) -> UIEdgeInsets

Описание
Создает вставку края для кнопки или вида. Вставка - это поле вокруг прямоугольника. Положительные значения представляют поля ближе к центру прямоугольника, а отрицательные значения представляют поля дальше от центра.

Параметры
top: вставка вверху объекта.
слева: вставка слева от объекта
внизу: вставка в нижней части объекта.
справа: вставка справа от объекта.

Возвращает
Вставка для кнопки или вида

Обратите внимание, что UIEdgeInsets также может быть использован для достижения того же.

Xcode 9.3 / Swift 4

0 голосов
/ 09 октября 2018

У меня были проблемы с тем, чтобы заставить это работать вместе с фоновыми цветами и дополнительными видами в камере.Закончилось тем, что:

1) Установите свойство представления фона ячеек с UIView, установленным с цветом фона.

let view = UIView()
view.backgroundColor = UIColor.white
self.backgroundView = view

2) Переместите это представление в layoutSubviews, чтобы добавить идеюинтервалов

override func layoutSubviews() {
    super.layoutSubviews()
    backgroundView?.frame = backgroundView?.frame.inset(by: UIEdgeInsets(top: 2, left: 0, bottom: 0, right: 0)) ?? CGRect.zero
}
0 голосов
/ 06 августа 2018

Я был в одной лодке. Сначала я попытался переключиться на разделы, но в моем случае это было больше головной болью, чем я думал, поэтому я искал альтернативу. Чтобы продолжал использовать строки (и не связывался с тем, как вы получаете доступ к данным вашей модели), вот что сработало для меня, просто используя маску :

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
{
    let verticalPadding: CGFloat = 8

    let maskLayer = CALayer()
    maskLayer.cornerRadius = 10    //if you want round edges
    maskLayer.backgroundColor = UIColor.black.cgColor
    maskLayer.frame = CGRect(x: cell.bounds.origin.x, y: cell.bounds.origin.y, width: cell.bounds.width, height: cell.bounds.height).insetBy(dx: 0, dy: verticalPadding/2)
    cell.layer.mask = maskLayer
}

Все, что вам осталось сделать, это увеличить высоту ячейки на то же значение, что и желаемое verticalPadding, а затем изменить внутренний макет так, чтобы любые виды, которые имели расстояние до краев ячейка имеет то же расстояние, увеличенное на verticalPadding/2. Небольшой недостаток: вы получаете verticalPadding/2 отступы сверху и снизу tableView, но вы можете быстро это исправить, установив tableView.contentInset.bottom = -verticalPadding/2 и tableView.contentInset.top = -verticalPadding/2. Надеюсь, это кому-нибудь поможет!

0 голосов
/ 22 апреля 2018

Ознакомьтесь с моим решением на GitHub с подклассами UITableView и использованием функций времени выполнения Objective-C.
Он в основном использует частную структуру данных Apple UITableViewRowData, которую я получил при поиске частного заголовка среды выполнения UITableView:

https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableView.h,

и вот вам желаемый приватный класс, который содержит все, что вам нужно для разметки пространств между вашими ячейками, как вы хотите, не устанавливая его в классах ячеек:

https://github.com/JaviSoto/iOS10-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UITableViewRowData.h

0 голосов
/ 07 октября 2016

Используйте UITableViewDelegate, heightForRowAtIndexPath и возвращайте высоту строки.

 (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 return 100.0f ;
}
0 голосов
/ 16 июня 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...