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 .
Haga su marco de tableView sentado en los límites:
tableView.frame = self.view.bounds; tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
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); }
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)
}