with uitableviewcell tableviewcontroller multiple example different custom iphone ios uitableview

iphone - uitableviewcell - uitableview swift 4



¿Cómo poner UITableView siempre en el centro de UIView? (4)

Me gustaría implementar un UITableView en el centro de un UIView . Inicialmente tiene solo 2 o 3 filas. Cuando el usuario agrega más filas, se extiende en dirección vertical, mientras que todo el contenido permanece en el centro, como se muestra a continuación:

¿Es posible hacer eso con UITableView ?


Otra solución es ajustar la inserción de contenido de la vista de tabla, ya que la solución de compensación de contenido no me funcionó. Aquí está la idea básica (insertada en una subclase UITableView personalizada):

- (void)reloadData { [super reloadData]; [self centerTableViewContentsIfNeeded]; } - (void)layoutSubviews { [super layoutSubviews]; [self centerTableViewContentsIfNeeded]; } - (void)centerTableViewContentsIfNeeded { CGFloat totalHeight = CGRectGetHeight(self.bounds); CGFloat contentHeight = self.contentSize.height; //If we have less content than our table frame then we can center BOOL contentCanBeCentered = contentHeight < totalHeight; if (contentCanBeCentered) { self.contentInset = UIEdgeInsetsMake(ceil(totalHeight/2.f - contentHeight/2.f), 0, 0, 0); } else { self.contentInset = UIEdgeInsetsZero; } }

Para los de corazón rápido aquí hay un Patio de Juegos:

import UIKit import Foundation import XCPlayground class CenteredTable: UITableView { override func reloadData() { super.reloadData() centerTableContentsIfNeeded() } override func layoutSubviews() { super.layoutSubviews() centerTableContentsIfNeeded() } func centerTableContentsIfNeeded() { let totalHeight = CGRectGetHeight(bounds) let contentHeight = contentSize.height let contentCanBeCentered = contentHeight < totalHeight if (contentCanBeCentered) { contentInset = UIEdgeInsets(top: ceil(totalHeight/2 - contentHeight/2), left: 0, bottom: 0, right: 0); } else { contentInset = UIEdgeInsetsZero; } } } class DataSource: NSObject, UITableViewDataSource { let items = ["Mr", "Anderson", "Welcome", "Back", "We", "Missed", "You"] func registerReusableViewsWithTable(tableView: UITableView) { tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell") } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell cell.textLabel?.text = items[indexPath.row] cell.textLabel?.textAlignment = .Center return cell } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return items.count } } let dataSource = DataSource() let table = CenteredTable(frame: CGRectMake(0, 0, 300, 800), style: UITableViewStyle.Plain) table.tableFooterView = UIView(frame: CGRectZero) let container = UIView(frame: table.frame) container.addSubview(table) dataSource.registerReusableViewsWithTable(table) table.dataSource = dataSource table.reloadData() XCPShowView("table", container) container


Se puede hacer usando la propiedad contentOffset de UIScrollView .

  1. Haga su marco de tableView sentado en los límites:

    tableView.frame = self.view.bounds; tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

  2. Declara un método -layoutTableView:

    - (void)layoutTableView { CGSize contentSize = tableView.contentSize; CGSize boundsSize = tableView.bounds.size; CGFloat yOffset = 0; if(contentSize.height < boundsSize.height) { yOffset = floorf((boundsSize.height - contentSize.height)/2); } tableView.contentOffset = CGPointMake(0, yOffset); }

  3. Cuando llame a [tableView reloadData] , simplemente llame a [self layoutTableView] después.


Si no usa sus encabezados en la vista de tabla, puede calcular dinámicamente la altura de las celdas en comparación con la altura delimitada de las vistas de tabla.

Felicitaciones a https://.com/a/15026532/1847601

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { CGFloat contentHeight = 0.0; for (int section = 0; section < [self numberOfSectionsInTableView: tableView]; section++) { for (int row = 0; row < [self tableView: tableView numberOfRowsInSection: section]; row++) { NSIndexPath *indexPath = [NSIndexPath indexPathForRow: row inSection: section]; contentHeight += [self tableView: tableView heightForRowAtIndexPath: indexPath]; } } return (tableView.bounds.size.height - contentHeight)/2; } - (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { UIView *view = [[UIView alloc] initWithFrame: CGRectZero]; view.backgroundColor = [UIColor clearColor]; return view; }


Swift 3

private func hightTableView() { yourTableView.frame = CGRect(x: 0, y: Int((Int(view.frame.height) - rowHeight * yourArrayData.count) / 2), width: widthTable, height: rowHeight * yourArrayData.count) }