Когда я настраиваю табличное представление с 4 строками, все еще есть дополнительные разделительные линии (или дополнительные пустые ячейки) под заполненными строками.
Как я могу удалить эти ячейки?
Когда я настраиваю табличное представление с 4 строками, все еще есть дополнительные разделительные линии (или дополнительные пустые ячейки) под заполненными строками.
Как я могу удалить эти ячейки?
Просто перетащите UIView в таблицу. В раскадровке он будет сидеть наверху ваших пользовательских ячеек. Вы можете назвать его "нижним колонтитулом".
Здесь для ясности это показано зеленым цветом, вам, вероятно, понадобится четкий цвет.
Обратите внимание, что, регулируя высоту, вы можете влиять на то, как обрабатывается "нижний отскок" таблицы, как вы предпочитаете. (Высота нуля обычно прекрасна).
Сделать это программно:
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.tableFooterView = UIView()
}
- (void)viewDidLoad
{
[super viewDidLoad];
// This will remove extra separators from tableview
self.tableView.tableFooterView = [UIView new];
}
или, если хотите,
self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
Добавить в контроллер табличного представления...
- (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];
}
Вот еще один способ сделать это с использованием стиля сгруппированной таблицы, и вы, вероятно, не догадаетесь. Добавление заголовка и нижнего колонтитула в таблицу (возможно, один или другой, не проверено) заставляет разделители исчезать из строк заливки/пустых строк.
Я наткнулся на это, потому что мне хотелось немного места в верхней и нижней частях таблиц, чтобы уменьшить риск попадания кнопок вместо таблицы с мясистыми пальцами. Здесь метод придерживаться пустого представления в виде верхнего и нижнего колонтитула. Используйте любую нужную вам высоту, вы по-прежнему устраняете дополнительные разделительные линии.
- (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]
. Если вы не видите красных столбцов в нижней части таблицы, нижний колонтитул не был установлен.
Удаление лишних разделительных линий для пустых строк в UITableView в Swift
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.yourTableview.tableFooterView = UIView()
}
Я хотел бы расширить 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:)
Просто перетащите UIView
в свой UITableView
в качестве нижнего колонтитула. Установите высоту просмотра нижнего колонтитула равным 0.
Попробуйте это. Это сработало для меня:
- (void) viewDidLoad
{
[super viewDidLoad];
// Without ARC
//self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];
// With ARC, tried on Xcode 5
self.tableView.tableFooterView = [UIView new];
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.tableFooterView = UIView()
}
Вы можете просто добавить пустой нижний колонтитул в конце, тогда он будет скрывать пустые ячейки, но он также будет выглядеть довольно уродливо:
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
Продвижение решения J. Costa: вы можете внести глобальные изменения в таблицу, добавив следующую строку кода:
[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];
внутри первого возможного метода (обычно в AppDelegate
, в: application:didFinishLaunchingWithOptions:
method).
Если вы используете Swift, добавьте следующий код в viewDidLoad контроллера, который управляет табличным представлением:
override func viewDidLoad() {
super.viewDidLoad()
//...
// Remove extra separators
tableView.tableFooterView = UIView(frame: CGRectZero)
}
Я знаю, что этот вопрос был принят, но я поставил здесь разные способы скрытия дополнительной разделительной строки UITableView
.
Вы можете скрыть стандартную разделительную строку tableView
и добавить свою собственную строку вверху каждой ячейки.
Обновление:
Самый простой способ добавить пользовательский разделитель - добавить простой UIView
1px height:
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];
Попробуйте любой из них;
просто добавьте этот код (Swift)..
tableView.tableFooterView = UIView()
Я использовал табличное представление, чтобы показать фиксированное количество строк с фиксированной высотой, поэтому я просто изменил его размер и сделал его недоступным для прокрутки.
Дополнительная строка разделителя uitableview скрыть дополнительные разделители строк скрыть в swift 3.0
self.tbltableView.tableFooterView = UIView(frame: .zero)
Просто добавьте представление с требуемым цветом разделителя в качестве цвета фона, ширину 100%, высоту 1 пиксель в позиции x0 y-1 для вашего TableViewCell. Убедитесь, что tableViewCell не поддерживает клип-объекты, а tableView должен.
Таким образом, вы получаете абсолютный простой и рабочий разделитель только между существующими ячейками без какого-либо взлома кода или IB.
Примечание. При вертикальном верхнем отскоке появляется первый разделитель, но это не должно быть проблемой, потому что это поведение по умолчанию iOS.
Swift прекрасно работает с:
tableView.tableFooterView = UIView()
Если вы не хотите, чтобы какой-либо разделитель после последней ячейки, то для нижнего колонтитула вам нужно приблизиться к нулевой, но не нулевой высоте.
В UITableViewDelegate
:
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return .leastNormalMagnitude
}
Чтобы программно удалить лишние разделительные линии из нижней части UItableview, просто запишите следующие две строки кода, и он удалит из него дополнительный разделитель.
tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;
Этот трюк работает на меня все время, попробуйте сами.
Вы можете найти много ответов на этот вопрос. Большинство из них tableFooterView
с манипуляциями с атрибутом UITableView
tableFooterView
и это правильный способ скрыть пустые строки. Для удобства я создал простое расширение, которое позволяет включать/выключать пустые строки из Interface Builder. Вы можете проверить его из этого GIST файла. Я надеюсь, что это может сэкономить немного вашего времени.
extension UITableView {
@IBInspectable
var isEmptyRowsHidden: Bool {
get {
return tableFooterView != nil
}
set {
if newValue {
tableFooterView = UIView(frame: .zero)
} else {
tableFooterView = nil
}
}
}
}
Использование:
tableView.isEmptyRowsHidden = true
Мне повезло с реализацией одного куска принятого ответа (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
с одним разделом (если у вас несколько разделов, вам нужно указать последний).
Если вы хотите удалить нежелательное пространство в UITableview, вы можете использовать ниже двух методов
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 0.1;
}
Если у вас есть только один раздел, самым быстрым и простым способом является просто установить стиль Table View с "Plain" на "Grouped". (см. изображение)
Если у вас больше разделов, вам может потребоваться установить высоту заголовка в ноль (в зависимости от вкуса вашего клиента/вашего менеджера проекта)
Если у вас есть больше разделов и вы не хотите связываться с заголовками (даже если это всего лишь одна строка в простейшем случае), вам нужно установить UIView как нижний колонтитул, как это было объяснено в предыдущие ответы)
Просто небольшое расширение для раскадровки:
extension UITableView {
@IBInspectable
var hideSeparatorForEmptyCells: Bool {
set {
tableFooterView = newValue ? UIView() : nil
}
get {
return tableFooterView == nil
}
}
}
Быстрый и легкий Swift 4 way.
override func viewDidLoad() {
tableView.tableFooterView = UIView(frame: .zero)
}
Если у вас есть статические клетки. Вы также можете отключить разделитель из окна инспектора. (это не будет желательно, если вам нужен разделитель. В этом случае используйте метод, показанный выше)
Попробуйте это
self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
Если у вас есть searchbar
в вашем view
(например, для ограничения количества результатов), вы должны также добавить следующее в shouldReloadTableForSearchString
и shouldReloadTableForSearchScope:
controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
Детали: Swift 3, Xcode: 8.1
extension UITableView {
var emptyCellsEnabled: Bool {
set(newValue) {
if newValue {
tableFooterView = nil
} else {
tableFooterView = UIView()
}
}
get {
if tableFooterView == nil {
return true
}
return false
}
}
}
// hide empty cells
tableView.emptyCellsEnabled = false
// show empty cells
tableView.emptyCellsEnabled = true
ViewController.swift
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var footerSwitchButton: UIButton!
var emptyCellsEnabled: Bool {
get {
return tableView.emptyCellsEnabled
}
set (newValue) {
if newValue {
footerSwitchButton.setTitle("Hide", for: .normal)
} else {
footerSwitchButton.setTitle("Show", for: .normal)
}
tableView.emptyCellsEnabled = newValue
}
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = "\(indexPath)"
return cell
}
@IBAction func buttonAction(_ sender: Any) {
emptyCellsEnabled = !emptyCellsEnabled
}
}
extension UITableView {
var emptyCellsEnabled: Bool {
set(newValue) {
if newValue {
tableFooterView = nil
} else {
tableFooterView = UIView()
}
}
get {
if tableFooterView == nil {
return true
}
return false
}
}
}
Main.storyboard
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="ABN-e6-xZB">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11524"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModule="stackoverflow_1633966" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="Vun-mi-5Wc">
<rect key="frame" x="0.0" y="64" width="375" height="603"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</tableView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="Vun-mi-5Wc" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" id="9Pj-Wl-qW6"/>
<constraint firstItem="Vun-mi-5Wc" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="KIO-bu-Dz6"/>
<constraint firstItem="Vun-mi-5Wc" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="gJl-YJ-vQY"/>
<constraint firstAttribute="trailing" secondItem="Vun-mi-5Wc" secondAttribute="trailing" id="gef-yl-Rvt"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="tH2-D6-JJL">
<barButtonItem key="rightBarButtonItem" style="plain" id="ROj-kP-cCC">
<button key="customView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" id="0C7-jC-HjH">
<rect key="frame" x="276" y="7" width="83" height="30"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<state key="normal" title="Button"/>
<connections>
<action selector="buttonAction:" destination="BYZ-38-t0r" eventType="touchUpInside" id="d6H-00-Yww"/>
</connections>
</button>
</barButtonItem>
</navigationItem>
<connections>
<outlet property="footerSwitchButton" destination="0C7-jC-HjH" id="EgU-Vx-Skx"/>
<outlet property="tableView" destination="Vun-mi-5Wc" id="OHe-J2-y4A"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1072.8" y="137.18140929535232"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="xgG-0P-k1k">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="ABN-e6-xZB" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="xS4-8G-RJU">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="JET-Cj-BFP"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Bh9-fJ-Nrf" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="133.59999999999999" y="137.18140929535232"/>
</scene>
</scenes>
</document>
UIKit
не создает пустую ячейку, когда tableView
имеет tableFooterView
. Таким образом, мы можем сделать трюк и назначить объект UIView
нулевой высоты как нижний колонтитул tableView
.
tableView.tableFooterView = UIView()
В 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)
}
Я добавил это небольшое расширение таблицы, которое помогает во всем
extension UITableView {
func removeExtraCells() {
tableFooterView = UIView(frame: .zero)
}
}