Усуньте додаткові роздільники нижче UITableView


714

Коли я налаштовую подання таблиці з 4 рядків, під заповненими рядами ще є додаткові рядки розділення (або додаткові порожні клітинки).

Як я можу видалити ці клітини?

зображення для додаткових розділових ліній у UITableView

Відповіді:


1505

Побудова інтерфейсу (iOS 9+)

Просто перетягніть UIView до таблиці. У раскадровці він буде розташовуватися вгорі під вашими користувацькими клітинками. Ви можете віддати перевагу назві його "колонтитул".

Тут для наочності показано зеленим кольором, ви, мабуть, хочете чіткого кольору.

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

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


Щоб це зробити програмно:

Швидкий

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

Ціль-С

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

або якщо ви хочете,

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Історія в iOS:

Додати в контролер подання таблиці ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

а за потреби ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}

Я думаю, що ваші описи та ваш код зворотні. У будь-якому випадку це для мене спрацювало чудово. Я використовую лише "справжні" колонтитули з згрупованими таблицями, тому я додав, якщо (tableView.style! = UITableViewStyleGrouped) {} ​​навколо вашого коду. Тепер усі мої негруповані таблиці втрачають зайві комірки, а мої згруповані таблиці не впливають.
arlomedia

Слідуючи моїй примітці вище, я додам попередження, що якщо ви поставите будь-які умови у метод viewForFooterInSection, будьте впевнені, що метод повертає або UIView, або нуль. Якщо ви випадково повернете недійсні, ваш додаток вийде з ладу!
arlomedia

4
@Mathieu Це спрацює, тому що якщо у таблиці є власний колонтитул, він не створюватиме "fantom" рядки для заповнення таблиці. Таким чином, у вас буде створено порожній вигляд, який буде використовуватися як колонтитул, і встановіть висоту майже 0 (вона не може бути нульовою або iOS не виведе її). Цим простим трюком ви зміните поведінку за замовчуванням.
Дж. Коста

2
@ j.Costa: Ваше рішення буде працювати лише один раз, коли створено придатний перегляд. після натискання на останню клітинку ваше рішення не є більш корисним. будь ласка, вдосконаліть свою відповідь.

3
Використання tableFooterViewзалишає роздільник для останньої комірки ряду, оскільки таблиця все ще передбачає вміст нижче цієї комірки. Використання історичного способу усуне цей останній роздільник і виглядає краще в цілому.
Джеймс Куанг

128

Ось ще один спосіб зробити це без стилю згрупованої таблиці, і ви, мабуть, не здогадалися. Додавання заголовка та колонтитула до таблиці (можливо, одного чи іншого достатньо, не перевірено) призводить до того, що роздільники зникають із заповнюючих / порожніх рядків.

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

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

У відповідь на @Casebash я повернувся до коду свого додатка ("AcmeLists" Менеджер списку в магазині iTunes ...) і коротко замикав метод addHeaderAndFooter для перевірки. Без нього у мене є додаткові роздільники рядків; з кодом, я маю те, що ви бачите в цьому вікні оснащення: картинка не розділяє рядки таблиць . Тож я не впевнений, чому б це не працювало для вас. Більше того, для мене є сенс, що мати будь-який спеціальний колонтитул на поданні таблиці обов'язково повинен буде припинити малювати роздільники рядків для порожніх рядків під ним. Це було б огидно. Для довідки я переглянув таблиці, де було більше рядків, ніж можна було переглянути на екрані, а потім таблицю з двома рядами. В обох випадках немає сторонніх сепараторів.

Можливо, ваші власні представлення фактично не додані. Для того, щоб перевірити , що встановити колір фону на щось інше , ніж clearColor, наприклад, [UIColor redColor]. Якщо ви не бачите червоних смуг внизу таблиці, колонтитул не встановлено.


1
Ви можете це зробити і в ІБ. Просто перетягніть UIView внизу TableView і встановіть висоту на 1.
Ortwin Gentz

70

Видалення додаткових розділових ліній для порожніх рядків у UITableView у Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}

34

Я хотів би продовжити відповідь wkw :

Просто додавання лише нижнього колонтитула висотою 0 зробить свою справу. (випробувано на sdk 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

або навіть простіше - там, де ви налаштували перегляд таблиці, додайте цей рядок:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

або ще простіше - просто видалити будь-які роздільники:

[_tableView setTableFooterView:[UIView new]];

Дякуємо wkw знову :)


Це правильна відповідь, тому що в інших методах останній ряд залишається без роздільника рядків
Анкуш

22

Для iOS 7+, використовуючи Storyboards

Просто перетягніть UIViewу свій UITableViewяк нижній колонтитул. Встановіть висоту подання нижнього колонтитула на 0.


18

Спробуйте це. Це працювало для мене:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}


11

Якщо ви використовуєте Swift, додайте наступний код до viewDidLoad контролера, який керує переглядом таблиці:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}

8

Ви можете просто додати порожній колонтитул в кінці, тоді він приховає порожні комірки, але він також буде виглядати досить некрасиво:

tableView.tableFooterView = UIView()

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

Є кращий підхід: додайте рядок у 1 бал в кінці подання таблиці, оскільки колонтитул та порожні комірки також більше не відображатимуться.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

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


Дуже приємний вклад, однак не потрібно робити останню клітинку з густим кольором роздільника внизу, а просто зробити її таким же кольором тла клітини, і вона також відходить.
Густаво Байоккі Коста,

Однак ви віддаєте перевагу. Але я думаю, що своєрідний «незавершений» сепаратор виглядає досить некрасиво.
Дарко


7

Просування рішення Дж. Кости: Ви можете внести глобальні зміни в таблицю, поставивши цей рядок коду:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

всередині першого можливого методу (як правило, в AppDelegate, в: application:didFinishLaunchingWithOptions:метод).


2
Будьте обережні з цим, бувають випадки, коли передбачуваний колонтитул можна перекрити, і ви витратите день чи два на сумніви у вашому розумі. Також tableFooterView не позначений UI_APPEARANCE_SELECTOR, тому фактична поведінка може змінитися в будь-який час.
mwright

6

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

Ви можете приховати tableViewстандартний рядок розділення та додати свій власний рядок у верхній частині кожної комірки.

Оновлення:

Найпростіший спосіб додати спеціальний роздільник - додати просто UIViewвисотою 1 піксель:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

АБО

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

АБО

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

АБО найкращий і простий спосіб, який я люблю колись

self.tableView.tableFooterView = [[UIView alloc] init];

Спробуйте будь-який із них;


6

Ви можете знайти багато відповідей на це питання. Більшість з них навколо маніпуляції з атрибутом UITableView's, tableFooterViewі це правильний спосіб приховати порожні рядки. Для зручності я створив просте розширення, яке дозволяє вмикати / вимикати порожні рядки з Interface Builder. Ви можете перевірити це з цього файлу суті . Я сподіваюся, що це може зекономити твій час.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Використання:

tableView.isEmptyRowsHidden = true

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


5

uitableview додаткова лінія роздільника приховати додаткові лінії роздільника, приховати в швидкому 3.0

 self.tbltableView.tableFooterView = UIView(frame: .zero)

5

Якщо ви не хочете, щоб після останньої комірки не було жодного роздільника, то для вашого нижнього колонтитула потрібна висота, близька до нуля, але не нуля.

У вашому UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}

1
чудово! Працювали для мене !!
Антоній Рафель


3

Просто додайте подання з потрібним кольором роздільника як кольором тла, 100% шириною, висотою 1 пікселя у позиції x0 y-1 у ваш tableViewCell. Переконайтесь, що tableViewCell не обрізає підпогляди, а замість tableView слід.

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

Примітка. У вертикальному відриві з'являється перший роздільник, але це не повинно бути проблемою, оскільки це поведінка iOS за замовчуванням.


3

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


3

Щоб усунути додаткові лінії розділення з нижньої частини UItableview програмно, просто запишіть наступні два рядки коду, і він видалить з нього зайвий роздільник.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Цей фокус працює для мене весь час, спробуйте самі.


2

Мені пощастило реалізувати єдиний фрагмент прийнятої відповіді (iOS 9+, Swift 2.2). Я спробував реалізувати:

self.tableView.tableFooterView = UIView(frame: .zero)

Однак на мене це не вплинуло tableView- я вважаю, що це може бути пов'язане з тим, що я використовуюUITableViewController .

Натомість мені довелося лише перекрити viewForFooterInSectionметод (я не встановив tableFooterViewінше місце):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Це спрацювало чудово для tableViewодного розділу (якщо у вас є кілька розділів, вам потрібно вказати останній).


2

Якщо у вас є лише один розділ, то найшвидший і найпростіший спосіб - просто встановити стиль перегляду таблиці з "Звичайний" на "Згрупований". (див. зображення)

Згрупується TableView

Якщо у вас є більше розділів, вам може знадобитися встановити висоту заголовка до нуля (залежно від смаку вашого / вашого клієнта / менеджера проекту)

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


2

Розширення Swift 4.0

Лише невелике розширення для табло:

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

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}

2

Швидкий і легкий швидкий чотиристоронній шлях.

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Якщо у вас є статичні комірки. Ви також можете вимкнути роздільник у вікні інспектора. (це не бажано, якщо вам потрібен роздільник. У цьому випадку використовуйте метод, показаний вище) вікно інспектора


На налаштування нового UIView для tableFooterView вже відповіли 10 разів, з кращими поясненнями щодо того, чому кращий код (у вас відсутній super.viewDidLoad()) та включений у відповідь вікі вгорі. Що стосується видалення всіх роздільників, це справді не те, про що йдеться у цьому питанні, тому краще відкатіте останнє редагування та / або видаліть свою відповідь цілком.
Cœur

1

Якщо ви хочете видалити небажаний простір в UITableview, ви можете використовувати нижче два способи

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

1

Я додав це невелике розширення tableview, яке допомагає протягом усього часу

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}

1

Спробуйте з цим

для цілі С

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

для Свіфта

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}

0

Спробуйте це

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];

0

UIKitне створює порожню клітинку, коли tableViewмає a tableFooterView. Таким чином, ми можемо зробити трюк і призначити об’єкт нульової висоти UIViewяк колонтитул tableView.

tableView.tableFooterView = UIView()

0

Якщо у вас є searchbarсвій view(для обмеження кількості результатів, наприклад), ви також повинні додати наступне в shouldReloadTableForSearchStringтаshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];

0

В Swift (я використовую 4.0), ви можете зробити це шляхом створення призначеного для користувача UITableViewCellкласу, а також overridingна setSelectedметод. Тоді separator insetsвсі до 0 . (мій основний клас із поданням таблиці має чіткий фон) колір.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.