ios - source - uitableviewcell swift 3
Cómo configurar el ancho completo del separador en UITableView (14)
Así que tengo una UITableView donde los separadores no tienen todo el ancho. Termina como 10 píxeles antes del lado izquierdo. Estaba jugando con este código en viewDidLoad
self.tableView.layoutMargins = UIEdgeInsetsZero;
también en el guión gráfico cuando puede seleccionar selectores personalizados o predeterminados. Ahora todas las celdas que se rellenan no tienen los selectores de ancho completo pero las celdas que están vacías tienen ancho completo.
¿Cómo puedo arreglar esto?
Gracias por toda la ayuda
Úselo en el método cellForRowAtIndexPath, para configurar las especificaciones del separador de la celda,
funciona perfecto para iOS9.0 +
cell.separatorInset = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
En viewDidLoad
(probado iOS11 - swift 4.1)
tratar
tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
Esto funcionó para mí en dispositivos iOS 8.4 - 9.0 usando Xcode 6.4 y Swift 1.2:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = UITableViewCell()
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
return cell
}
Actualización de Swift 3.0
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
Nada de lo anterior funcionó para mí en Swift 2.2 y Xcode 7.3.1
Resultó ser la solución más simple de todas. Sin código necesario. Simplemente cambie los valores de los márgenes de diseño de celdas de TableView en su inspector UITableView:
Ninguna de estas soluciones funciona en el iPad, pero he encontrado una solución que cubre ambos dispositivos:
Con células reutilizables:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
...[other code]...
[cell setLayoutMargins:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
return cell;
}
Con células no reutilizables:
- (void)removeSeparatorInset:(UITableView*)tableView{
NSArray *cells = [tableView visibleCells];
for (UITableViewCell *cell in cells){
[cell setLayoutMargins:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}
-(void) viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
[self removeSeparatorInset:self.tableView];
}
Solo para ampliar este enfoque:
@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;
Ambas propiedades pueden ser utilizadas por UITableView y UITableViewCell. Este último es, de hecho, una propiedad de UIView, que es una clase principal de UITableView y UITableViewCell.
Ok, encontré la respuesta. No sé por qué no me encontré con esta publicación antes, pero, por supuesto, después de publicar una pregunta, de repente aparece justo delante de usted. Recibí la respuesta de esta publicación: iOS 8 UITableView separator inset 0 no funciona
Solo agregue este código en su TableViewController
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
Para Swift 3:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
}
Para las personas que tienen problemas con el iPad, esto lo pondrá en un estado similar al iPhone. Luego puede ajustar el separadorInset según sea necesario.
tableView.cellLayoutMarginsFollowReadableWidth = false
Probado para iOS 9.3 y Swift 2.2. Asegúrese de poner el código en willDisplayCell
que se llama justo antes de mostrar la celda y no en cellForRowAtIndexPath
donde crea la celda solamente.
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
}
Agregue la override
a la función para UITableViewController, así: override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
Yo UITableViewController
de UITableViewController
y necesitaba adicionalmente las configuraciones de dos inserciones en willDisplayCell
para establecer también a preservesSuperviewLayoutMargins
en falso. En Swift se ve así:
override func tableView(_tableView: UITableView,
willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath) {
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
cell.preservesSuperviewLayoutMargins = false
}
}
para Swift 3:
override func viewDidLoad() {
super.viewDidLoad()
tableView.separatorInset = .zero
tableView.layoutMargins = .zero
}
para rápido en iOS 9+
si usa una UITableViewCell personalizada:
override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}
luego para su tabla vista en viewDidLoad:
self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;