O iOS 8.0 apresenta a propriedade layoutMargins nas células E nas visualizações de tabela.
Esta propriedade não está disponível no iOS 7.0, portanto, verifique antes de atribuí-la!
A solução fácil é subclassificar sua célula e substituir a propriedade das margens do layout, conforme sugerido por @ user3570727. No entanto, você perderá qualquer comportamento do sistema, como herdar margens da Área segura, por isso não recomendo a solução abaixo:
(Objetivo C)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(rápido 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Se você não deseja substituir a propriedade ou precisa configurá-la condicionalmente, continue lendo.
Além da layoutMargins
propriedade, a Apple adicionou uma propriedade ao seu celular que impedirá que ela herde as configurações de margem do seu Table View. Quando essa propriedade é configurada, suas células têm permissão para configurar suas próprias margens, independentemente da exibição da tabela. Pense nisso como uma substituição.
Essa propriedade é chamada preservesSuperviewLayoutMargins
e a configuração para NO
permitirá que a layoutMargin
configuração da célula substitua o que layoutMargin
estiver definido no seu TableView. Isso economiza tempo ( você não precisa modificar as configurações da Visualização da tabela ) e é mais conciso. Consulte a resposta de Mike Abdullah para obter uma explicação detalhada.
NOTA: o que se segue é uma implementação limpa para uma configuração de margem no nível da célula , conforme expresso na resposta de Mike Abdullah. A configuração de sua célula preservesSuperviewLayoutMargins=NO
garantirá que a Visualização da tabela não substitua as configurações da célula. Se você realmente deseja que toda a exibição da tabela tenha margens consistentes, ajuste seu código de acordo.
Configure as margens da sua célula:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// Remove seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}
Definir a preservesSuperviewLayoutMargins
propriedade em sua célula como NÃO deve impedir que a exibição da tabela substitua as margens da célula. Em alguns casos, parece não funcionar corretamente.
Se tudo falhar, você pode forçar com força suas margens do Table View:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// Force your tableview margins (this may be a bad idea)
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
tableView.separatorInset = .zero
}
if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
tableView.layoutMargins = .zero
}
}
... e lá vai você! Isso deve funcionar no iOS 7 e 8.
EDIT: Mohamed Saleh me chamou a atenção para uma possível alteração no iOS 9. Você pode precisar definir as Table View cellLayoutMarginsFollowReadableWidth
comoNO
se você deseja personalizar inserções ou margens. Sua milhagem pode variar, isso não está muito bem documentado.
Esta propriedade existe apenas no iOS 9, portanto, verifique antes de configurar.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(o código acima da inserção 0 do separador UITableView do iOS 8 não está funcionando )
EDIT: Aqui está uma abordagem pura do Interface Builder:
OBSERVAÇÃO: o iOS 11 muda e simplifica muito desse comportamento, uma atualização será lançada ...