Як додати інтервал між UITableViewCell


182

Чи є спосіб додати проміжки між ними UITableViewCell?

Я створив таблицю, і кожна комірка містить лише зображення. Зображення призначається клітинці так:

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

але це робить зображення збільшеним і вписується у всю клітинку, і між зображеннями немає проміжків.

Або скажімо таким чином, висота зображення становить, наприклад, 50, і я хочу додати 20 інтервалів між зображеннями. Чи є спосіб досягти цього?


1
Для Swift 2.2 см моя відповідь тут: stackoverflow.com/a/37673417/2696626
ibrahimyilmaz

Відповіді:


160

Швидка версія

Оновлено для Swift 3

Ця відповідь дещо більш загальна, ніж оригінальне питання заради майбутніх глядачів. Це додатковий приклад до базового прикладу UITableView для Swift .

введіть тут опис зображення

Огляд

Основна ідея - створити новий розділ (а не новий рядок) для кожного елемента масиву. Потім секції можна розташовувати, використовуючи висоту заголовка секції.

Як це зробити

  • Налаштуйте свій проект, як описано в прикладі UITableView для Swift . (Тобто додайте a UITableViewі підключіть tableViewрозетку до контролера перегляду).

  • У програмі Interface Builder змініть колір фону основного виду на світло-синій, а UITableViewколір тла - на очищення.

  • Замініть код ViewController.swift на наступне.

ViewController.swift

import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    
    // These strings will be the data for the table view cells
    let animals: [String] = ["Horse", "Cow", "Camel", "Sheep", "Goat"]
    
    let cellReuseIdentifier = "cell"
    let cellSpacingHeight: CGFloat = 5
    
    @IBOutlet var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // These tasks can also be done in IB if you prefer.
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReuseIdentifier)
        tableView.delegate = self
        tableView.dataSource = self
    }
    
    // MARK: - Table View delegate methods
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return self.animals.count
    }
    
    // There is just one row in every section
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    // Set the spacing between sections
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return cellSpacingHeight
    }
    
    // Make the background color show through
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let headerView = UIView()
        headerView.backgroundColor = UIColor.clear
        return headerView
    }
    
    // create a cell for each table view row
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!
        
        // note that indexPath.section is used rather than indexPath.row
        cell.textLabel?.text = self.animals[indexPath.section]
        
        // add border and color
        cell.backgroundColor = UIColor.white
        cell.layer.borderColor = UIColor.black.cgColor
        cell.layer.borderWidth = 1
        cell.layer.cornerRadius = 8
        cell.clipsToBounds = true
        
        return cell
    }
    
    // method to run when table view cell is tapped
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // note that indexPath.section is used rather than indexPath.row
        print("You tapped cell number \(indexPath.section).")
    }
}

Зверніть увагу, що indexPath.sectionвикористовується не indexPath.rowдля отримання належних значень для елементів масиву та позицій дотику.

Як ви отримали додаткові прокладки / простір праворуч і ліворуч?

Я отримав це так само, як ви додаєте пробіли до будь-якого виду. Я використовував обмеження автоматичного компонування. Просто скористайтеся інструментом штифтів у програмі Interface Builder, щоб додати інтервали для провідних та кінцевих обмежень.


Привіт, мені було цікаво, чи це можливо без перетворення всіх ваших рядків у розділи. У мене є рамки для кожного tableViewCell, тому збільшення висоти не допоможе. У мене дуже багато налаштувань для моєї комірки, і я не хочу перетворювати її на секції. Дякую!
Ujjwal-Nadhani

3
@ user2901306, спочатку я вагався використовувати цей метод, тому що мені здалося, що я повинен мати можливість просто використовувати рядки та збільшувати маржу чи щось. Однак я не знайшов способу це зробити, і цей метод спрацював досить добре. Вам не потрібно змінювати налаштування у вашій стільникові. Потрібно лише додати numberOfSectionsInTableViewі return 1кількість рядків. Потім використовуйте indexPath.sectionдля отримання поточного індексу комірок. Спробуйте один раз. Я думаю, ви виявите, що вам не потрібно вносити дуже багато змін у поточну установку. Це, безумовно, простіше, ніж підкласифікація.
Сурагч

Використання cell.layer.xxx у cellForRow може надати вам ефективність. Краще встановіть ці значення в XIB
Абхішек Беді

@AbhishekBedi, я завжди знаходив layerманіпуляції досить швидко. Ви це говорите, тому що помітили хіт виступу, або як загальну добру практику? Навіть якщо ви встановите їх у XIB, вони все одно повинні бути встановлені під час створення комірки.
Сурагч

1
@FateNuller, я не згоден з тобою. Відповідь Хузама виглядає досить добре.
Сурагч

150

Моє просте рішення за допомогою Swift :

// Inside UITableViewCell subclass

override func layoutSubviews() {
    super.layoutSubviews()

    contentView.frame = contentView.frame.inset(by: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
}

Результат введіть тут опис зображення


11
Приємне рішення. Якщо у когось є проблеми, я повинен був зателефонувати super.layoutSubviews()спершу, щоб переконатися, що весь перегляд був належним чином викладений перед встановленням його кадру.
ruttopia

@Husam Ваше рішення працювало на мене. Але у мене є проблема, коли обрана комірка. Я встановив межу для contentView, і кожен раз, коли я вибираю комірку, межа буде меншою. Як я можу це виправити?
Bad_Developer

@SonHoang Ви , можливо , буде потрібно перевизначити didSetдля selectedзмінної і виклику layoutSubviews()всередині!
Хусам

1
Гей, Хусам. Дякую за чудове рішення. Не кажіть мені, як змінити колір доданого вмісту між клітинками?
А.Кант

1
Це таке набагато краще рішення, ніж прийнята відповідь. Прийнята відповідь має чорт біля 100 рядків коду, і це лише один. Неймовірно.
YungGun

135

Шукаю додавання пробілів між клітинками - це зробити numberOfSections = "Ваш масив рахувати" і зробити кожен розділ містить лише один рядок. А потім визначте headerView та його висоту.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return yourArry.count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return cellSpacingHeight;
}

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    UIView *v = [UIView new];
    [v setBackgroundColor:[UIColor clearColor]];
    return v;
}

22
Це чудово працює. Мені довелося трохи змінити cellForRowAtIndexPath, не звичайний масив [indexPath.row], а масив [indexPath.section]. Інакше він покаже перший елемент масиву у всіх розділах.
Tom Spee

@TomSpee - Як ви вирішили цю проблему в cellForRowAtIndexPath?

5
@TKutal - Так само , як звичайний код в cellForRowAtIndexPath але змінити indexPath.row до indexPath.section
Том Шпее

Хоча це і забезпечує те, що бажає, але я не вірю, що Apple рекомендувала б такий підхід. Виправте мене, якщо я помиляюся, але я вважаю, що "розділи" призначені для логічного розділення "розділів" даних, які ви представляєте у своїй таблиці. Не слід використовувати "розділи" для стилю пробілів між кожною коміркою даних, які в іншому випадку повинні відображатися в одному розділі. Я думаю, що кращим підходом, хоч і складнішим, було б підклас UITableViewCell і імітувати роздільник перегляду таблиці, додавши вигляд у нижню частину комірки.
FateNuller

2
Тоді Apple повинна скоріше не скаржитися, а створити зручний метод для зміни простору між рядками.
Арні

44

Мені потрібно було зробити те саме, що UITableCells має "простір" між ними. Оскільки ви не можете буквально додати простір між клітинками, ви можете підробити це, маніпулюючи висотою комірки UITableView, а потім додавши UIView до contentView вашої комірки. Ось знімок екрана прототипу, який я робив в іншому тестовому проекті, коли моделював це:

Пробіл між UITableViewCells

Ось деякий код (Примітка. Є багато важко кодованих значень для демонстраційних цілей)

По-перше, мені потрібно було встановити значення, heightForRowAtIndexPathщоб дозволити різні висоти на UITableViewCell.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSString *text = [self.newsArray  objectAtIndex:[indexPath row]];
    if ([text isEqual:@"December 2012"])
    {
        return 25.0;
    }

    return 80.0;
}

Далі я хочу маніпулювати зовнішнім виглядом UITableViewCells, тому я це роблю в willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPathметоді.

- (void)tableView:(UITableView *)tableView willDisplayCell:(NewsUITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (cell.IsMonth)
    {
        UIImageView *av = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 20, 20)];
        av.backgroundColor = [UIColor clearColor];
        av.opaque = NO;
        av.image = [UIImage imageNamed:@"month-bar-bkgd.png"];
        UILabel *monthTextLabel = [[UILabel alloc] init];
        CGFloat font = 11.0f;
        monthTextLabel.font = [BVFont HelveticaNeue:&font];

        cell.backgroundView = av;
        cell.textLabel.font = [BVFont HelveticaNeue:&font];
        cell.textLabel.textColor = [BVFont WebGrey];
    }


    if (indexPath.row != 0)
    {
        cell.contentView.backgroundColor = [UIColor clearColor];
        UIView *whiteRoundedCornerView = [[UIView alloc] initWithFrame:CGRectMake(10,10,300,70)];
        whiteRoundedCornerView.backgroundColor = [UIColor whiteColor];
        whiteRoundedCornerView.layer.masksToBounds = NO;
        whiteRoundedCornerView.layer.cornerRadius = 3.0;
        whiteRoundedCornerView.layer.shadowOffset = CGSizeMake(-1, 1);
        whiteRoundedCornerView.layer.shadowOpacity = 0.5;
        [cell.contentView addSubview:whiteRoundedCornerView];
        [cell.contentView sendSubviewToBack:whiteRoundedCornerView];

    }
}

Зауважте, що я створив висоту whiteRoundedCornerView 70.0, і саме це викликає модельований простір, оскільки висота клітини насправді 80,0, але мій contentView - 70,0, що надає їй зовнішній вигляд.

Можуть бути й інші способи досягти цього ще краще, але я просто знайшов, як це зробити. Я сподіваюся, що це може допомогти комусь іншому.


Просто FYI, для дуже великої кількості комірок ви хочете встановити вигляд вмісту всередині підкласу комірок замість willDisplayCell. Вистава починає робити величезний хіт, роблячи це таким чином, тим більше комірок ви додаєте до черги
BBH1023

@ BBH1023 Тіньовий шар розмножується щоразу, коли вигляд з’являється під час руху вперед-назад для швидкого перегляду. Як би ви запропонували скасувати це, якщо воно вже було застосовано один раз
сушене

щоб приватне додати більше тіні, зробіть це: тег NSInteger = 120; if (indexPath.row! = 0) {if (cell.tag! = 120) {cell.contentView.backgroundColor = [UIColor clearColor]; ... [cell.contentView sendSubviewToBack: whiteRoundedCornerView]; cell.tag = тег; }}
user3001228

24

Вам доведеться встановити кадр для вашого зображення. Неперевірений код є

cell.imageView.frame = CGRectOffset(cell.frame, 10, 10);

2
Щойно перевірений backgroundView, і це найпростіше робоче рішення
Сем

2
Просто переконайтеся, що ви зателефонували до цього коду, layoutSubviewsякщо ви підкласифікуєтеUITableViewCell
Mazyod

30
@ NicoHämäläinen Ну, я розробив понад 20 додатків за останні три роки, і Я ЗАВЖДИ підклас UITableViewCell, щоб отримати потрібний мені результат :) ... Підкласифікація UITableViewCellдуже поширена.
Мазюд

1
@ NicoHämäläinen немає нічого поганого в підкласифікації UITableViewCell. Коли ви створюєте власні, UITableViewCellsви повинні підкласифікувати UITableViewCell.
Popeye

1
@ NicoHämäläinen, то ви повинні оновити свій коментар. Люди, як правило, захоплюють інформацію і не читають далі. Оскільки цей сайт є чудовим ресурсом і розробники схильні довіряти фактам, які вони бачать тут, це може ввести їх в оману жахливих речей .. просто мої дві монети. Можливо, у мене є істерія
chrs

11

Я був у одному човні. Спочатку я спробував перейти на секції, але в моєму випадку це виявилося більше головним болем, ніж я спочатку думав, тому шукав альтернативу. Щоб продовжувати використовувати рядки (а не возитися з тим, як ви отримуєте доступ до даних своєї моделі), ось що для мене спрацювало лише за допомогою маски :

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набивання як у верхній, так і в нижній частині таблиціView, але ви можете швидко виправити це, встановивши tableView.contentInset.bottom = -verticalPadding/2і tableView.contentInset.top = -verticalPadding/2. Сподіваюся, це комусь допоможе!


1
Працює і в Swift 5.
LondonGuy

1
Найкраща відповідь !! Дякую. Якщо ви використовуєте користувацьку клітинку, то це працює в "переосмисленні func awakeFromNib ()"
дерева_are_great

10

Я думаю, що найбільш прямим рішенням вперед, якщо ви просто шукаєте трохи місця і, мабуть, найменш дорогого, буде просто встановити колір межі комірки на колір тла таблиці, а потім встановити ширину межі, щоб отримати бажаний результат!

    cell.layer.borderColor = blueColor.CGColor
    cell.layer.borderWidth = 3

1
Недобра ідея для прозорого фону. Інакше це може спрацювати.
ergunkocak

1
Це правда. Не рішення для всіх випадків, але воно буде працювати для деяких! @ergunkocak
Крейг

8

Якщо ви вже не використовуєте заголовки розділів (або колонтитули), ви можете використовувати їх для додавання довільних проміжків до комірок таблиці. Замість того, щоб мати один розділ з n рядками, створіть таблицю з n розділами з одним рядком кожен.

Реалізуйте tableView:heightForHeaderInSection:метод управління інтервалом.

Ви також можете застосувати, tableView:viewForHeaderInSection:щоб контролювати, як виглядає інтервал.


8

Я вирішив це так у Swift 4.

Я створюю розширення UITableViewCell і включаю цей код:

override open var frame: CGRect {
    get {
        return super.frame
    }
    set (newFrame) {
        var frame =  newFrame
        frame.origin.y += 10
        frame.origin.x += 10
        frame.size.height -= 15
        frame.size.width -= 2 * 10
        super.frame = frame
    }
}

override open func awakeFromNib() {
    super.awakeFromNib()
    layer.cornerRadius = 15
    layer.masksToBounds = false
}

Я сподіваюся, що це вам допоможе.


текст у комірці обрізаний
Мехдіко

перезавантаження CGRect працює, і я не додав прокинутого від NNib.
Ерік Тан

5

Приклад у швидкому 3 ..

введіть тут опис зображення

  1. Створіть програму для єдиного перегляду
  2. Додати табличний перегляд у контролері подання
  3. додати користувацьку клітинку для комірки tablview
  4. Код контролера подано нижче

       class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
       @IBOutlet weak var tableView: UITableView!
    
    
        var arraytable = [[String:Any]]()
         override func viewDidLoad() {
         super.viewDidLoad()
    
         arraytable = [
         ["title":"About Us","detail":"RA-InfoTech Ltd -A Joint Venture IT Company formed by Bank Asia Ltd"],
         ["title":"Contact","detail":"Bengal Center (4th & 6th Floor), 28, Topkhana Road, Dhaka - 1000, Bangladesh"]
    ]
    
    
    
    
    
    
       tableView.delegate = self
       tableView.dataSource = self
    
       //For Auto Resize Table View Cell;
      tableView.estimatedRowHeight = 44
       tableView.rowHeight = UITableViewAutomaticDimension
    
       //Detault Background clear
       tableView.backgroundColor = UIColor.clear
    }

    func numberOfSections (у tableView: UITableView) -> Int {return arraytable.count}

       func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return 1
     }
    
    // Set the spacing between sections
     func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return 10
    }
    
    // Make the background color show through
      func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView()
    headerView.backgroundColor = UIColor.clear
    
    return headerView
    }
    
         func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
         let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as! CustomCell
    
         cell.tv_title.text = arraytable[indexPath.section]["title"] as! String?
        cell.tv_details.text = arraytable[indexPath.section]["detail"] as! String?
    
       //label height dynamically increase
       cell.tv_details.numberOfLines = 0
    
    
    
    
       //For bottom border to tv_title;
       let frame =  cell.tv_title.frame
        let bottomLayer = CALayer()
       bottomLayer.frame = CGRect(x: 0, y: frame.height - 1, width: frame.width, height: 1)
        bottomLayer.backgroundColor = UIColor.black.cgColor
       cell.tv_title.layer.addSublayer(bottomLayer)
    
      //borderColor,borderWidth, cornerRadius
      cell.backgroundColor = UIColor.lightGray
      cell.layer.borderColor = UIColor.red.cgColor
      cell.layer.borderWidth = 1
      cell.layer.cornerRadius = 8
      cell.clipsToBounds = true
    
      return cell
      }
    
       }
  5. Завантажте повне джерело на Github: посилання

    https://github.com/enamul95/CustomSectionTable


він повторив ще одну відповідь, що на @Suragch відповіли раніше за швидку версію, будь ласка, уникайте дублювання
Amr Angry

1
це не гарне рішення. Якщо вам потрібен розділ заголовка із заголовком, це не спрацює
кузду

4

Я думаю про три підходи:

  1. Створіть власну клітинку таблиці, яка розкладає перегляд всієї комірки у бажаному вам порядку

  2. Замість того, щоб додавати зображення до перегляду зображень, очистіть підпогляди зображення, створіть спеціальний вигляд, який додає UIImageView для зображення та інший вигляд, можливо, простий UIView, що забезпечує потрібний інтервал, і додайте його як підвід подання зображення

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

Чи має це сенс?


4

Так, ви можете збільшити або зменшити проміжок (підкладку) між двома клітинками, створивши один базовий вигляд на перегляді вмісту в клітинку. Встановіть чіткий колір фону перегляду вмісту, і ви можете налаштувати висоту базового виду, щоб створити простір між комірками.


4

Виходячи з відповіді Хузама: Використання шару комірки замість перегляду вмісту дозволяє додавати рамку навколо всієї комірки та аксесуара, якщо потрібно. Цей метод вимагає ретельного регулювання нижнього обмеження клітини, а також цих вкладишів, інакше погляд не буде належним.

@implementation TableViewCell

- (void)awakeFromNib { 
    ... 
}

- (void) layoutSubviews {
    [super layoutSubviews];

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

@end

3

Змініть кількість рядків у розділі на 1 Ви змінили кількість розділів замість кількості рядків

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        1
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }

Тут ви ставите проміжки між рядками

 func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 50
    }

2

Я думаю, що це найчистіше рішення:

class MyTableViewCell: UITableViewCell {
    override func awakeFromNib() {
        super.awakeFromNib()
        layoutMargins = UIEdgeInsetsMake(8, 0, 8, 0)
    }
}

1
Я не бачив жодної візуальної зміни після застосування layoutMarginsцього способу. Можливо тому, що я використовую автоматичний розклад.
Cœur

Поля не буде "ламати" явну висоту для комірки, тому для роботи цього вам потрібно мати автоматичну висоту для клітин
Aviel Gross

1
У мене автоматична висота.
Cœur

2

Ця стаття допомогла, це майже все, що сказано в інших відповідях, але узагальнено та стисло

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

У ньому він застосовує їх лише до лівої та правої сторін, але UIEdgeInsetsMakeinit дозволяє додати оббивки до всіх чотирьох точок.

func UIEdgeInsetsMake (_ вгору: CGFloat, _ зліва: CGFloat, _ внизу: CGFloat, _ праворуч: CGFloat) -> UIEdgeInsets

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

Параметри
вгорі: Вставка у верхній частині об'єкта.
зліва: Вставка зліва від
нижнього об'єкта : Вставка в нижній частині об'єкта.
праворуч: Вставка праворуч від об’єкта.

Повертає
вставку для кнопки чи перегляду

Зауважте, що UIEdgeInsets також можна використовувати для досягнення цього.

Xcode 9.3 / Swift 4


У цій відповіді неправильно сказано, що код сумісний із Swift 4, але UIEdgeInsetsMake застарілий. Натомість слід використовувати UIEdgeInsets.
Жозе

developer.apple.com/documentation/uikit/… саме там, де йдеться про застаріле? Я використовую це у своїх проектах, і я працюю з останнім Xcode, тому Swift 9.3 @ José
Mauricio Chirino

Ти маєш рацію, вибач, моя погана. UIEdgeInsets є кращим, але це не означає, що інший є застарілим. SwiftLint скаржиться на застарілий конструктор, хоча при використанні UIEdgeInsetsMake.
Хосе

1
Добре, зрозумів. Будь ласка, видаліть голос, якщо ви були тим, хто кинув будь ласка, я ніколи не сказав, що моя відповідь була єдино можливою.
Маурісіо Чиріно

У ній сказано, що я не можу змінити свій голос, якщо ти не зміниш свою відповідь. Ви можете, можливо, трохи переробити формулювання?
Хосе

2

Використовувати купу різних розділів не потрібно. В інших відповідях використовуються вставки рамки та CGRect та шари та ... BLAH. Не добре; використовувати автоматичний макет і власну UITableViewCell. У цьому UITableViewCell замість того, щоб переглядати вміст всередині contentView, зробіть новий контейнерView (UIView), перегляньте перегляд контейнера всередині contentView, а потім перегляньте всі ваші перегляди всередині подання контейнера.

Щоб зробити інтервал зараз, просто відредагуйте поля макета перегляду контейнера, наприклад:

class CustomTableViewCell: UITableViewCell {
    let containerView = UIView()
    let imageView = UIImageView()

    required init?(coder aDecoder: NSCoder) {super.init(coder: aDecoder)}

    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        containerView.translatesAutoResizingMaskIntoConstraints = false
        imageView.translatesAutoResizingMaskIntoConstraints = false
        contentView.addSubview(containerView)
        containerView.addSubview(imageView)

        contentView.layoutMargins = UIEdgeInsets(top: 15, left: 3, bottom: 15, right: 3)
        containerView.layoutMargins = UIEdgeInsets(top: 15, left: 17, bottom: 15, right: 17) // It isn't really necessary unless you've got an extremely complex table view cell. Otherwise, you could just write e.g. containerView.topAnchor

        let cg = contentView.layoutMarginsGuide
        let lg = containerView.layoutMarginsGuide
        NSLayoutConstraint.activate([
            containerView.topAnchor.constraint(equalTo: cg.topAnchor),
            containerView.leadingAnchor.constraint(equalTo: cg.leadingAnchor),
            containerView.trailingAnchor.constraint(equalTo: cg.trailingAnchor),
            containerView.bottomAnchor.constraint(equalTo: cg.bottomAnchor),
            imageView.topAnchor.constraint(equalTo: lg.topAnchor),
            imageView.leadingAnchor.constraint(equalTo: lg.leadingAnchor),
            imageView.trailingAnchor.constraint(equalTo: lg.trailingAnchor),
            imageView.bottomAnchor.constraint(equalTo: lg.bottomAnchor)
        ])
    }
}


1

У моїй ситуації я використовував користувальницький UIView для переглядуForHeader в розділі також висотаForHeader в розділі повернення постійної висоти, скажімо, 40, проблема була тоді, коли немає даних, усі види заголовків були торкані один одного. тож я хотів пробіл між розділом у відсутності даних, тому я зафіксував, просто змінивши площину "стиль перегляду таблиці" на "Група". І це працювало для мене.


1

Ознайомтеся з моїм рішенням на 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


1

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

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
}

1

Використання заголовків як пробілів буде добре працювати, я думаю, якщо ви не хочете використовувати жодні заголовки. Інакше, напевно, не найкраща ідея. Те, що я думаю, це створити спеціальний вигляд комірок.

Приклади:

У користувацькій комірці зробіть фоновий вигляд з обмеженнями, щоб він не заповнив всю клітинку, надайте їй трохи прокладки.

Потім зробіть фон таблиці перегляду невидимим і видаліть роздільники:

// Make the background invisible
tableView.backgroundView = UIView()
tableView.backgroundColor = .clear

// Remove the separators
tableview.separatorStyle = .none

1

Якщо ви не хочете змінювати номер розділу та рядка свого подання таблиці (як я), ось що ви робите:

1) Додайте ImageView в нижній частині вікна таблиці таблиці.

2) Зробіть його таким же кольором, що і колір тла подання таблиці.

Я це зробив у своїй заявці, і це прекрасно працює. Ура! : D


0

введіть тут опис зображенняSWift-5, проміжок між UITableViewCell

    1. use sections instead of rows
    2. each section should return one row
    3. assign your cell data like this e.g [indexPath.section], instead of row
    4. use UITableView Method "heightForHeader" and return your desired spacing
    5. Do rest things as you were doing it

    Thanks!

0

Ви можете просто використовувати обмеження в такому коді:

class viewCell : UITableViewCell 
{

@IBOutlet weak var container: UIView!



func setShape() {
    self.container.backgroundColor = .blue
    self.container.layer.cornerRadius = 20
    container.translatesAutoresizingMaskIntoConstraints = false
    self.container.widthAnchor.constraint(equalTo:contentView.widthAnchor , constant: -40).isActive = true
           self.container.heightAnchor.constraint(equalTo: contentView.heightAnchor,constant: -20).isActive = true
           self.container.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
           self.container.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true

    }
}

важливо додати підперегляд (контейнер) і помістити в нього інші елементи.



-2

Рішення Swift 5.0

Всередині підкласу UITableViewCell

override func layoutSubviews() {
    super.layoutSubviews()
    let padding = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
    bounds = UIEdgeInsetsInsetRect(bounds, padding)
}

-4

Використовуйте UITableViewDelegate heightForRowAtIndexPathта повертайте висоту рядка.

 (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 return 100.0f ;
}

Питання полягає в тому, як додати проміжки між клітинками, а не висоту комірки
shippo7
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.