Migrei recentemente alguns códigos para o novo iOS 11 beta 5 SDK.
Agora recebo um comportamento muito confuso de UITableView. O tableview em si não é tão chique. Tenho células personalizadas, mas na maioria das vezes são apenas para a altura.
Quando empurro meu controlador de visualização com tableview, obtenho uma animação adicional em que as células "rolam para cima" (ou possivelmente todo o quadro tableview é alterado) e para baixo ao longo da animação de navegação push / pop. Por favor, veja gif:
Eu crio manualmente tableview
no loadView
método e configuro as restrições de layout automático para serem iguais à visão inicial, final, superior e inferior da supervisão do tableview. O superview é a visão raiz do controlador de visão.
Visualizar o código de envio do controlador é muito padrão: self.navigationController?.pushViewController(notifVC, animated: true)
O mesmo código fornece comportamento normal no iOS 10.
Você poderia me indicar o que está errado?
EDIT: Eu fiz um controlador tableview muito simples e posso reproduzir o mesmo comportamento lá. Código:
class VerySimpleTableViewController : UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
cell.textLabel?.text = String(indexPath.row)
cell.accessoryType = .disclosureIndicator
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
let vc = VerySimpleTableViewController.init(style: .grouped)
self.navigationController?.pushViewController(vc, animated: true)
}
}
EDIT 2: Consegui restringir o problema à minha personalização do UINavigationBar. Tenho uma personalização como esta:
rootNavController.navigationBar.setBackgroundImage(createFilledImage(withColor: .white, size: 1), for: .default)
onde createFilledImage
cria uma imagem quadrada com determinado tamanho e cor.
Se eu comentar esta linha, recupero o comportamento normal.
Eu apreciaria qualquer opinião sobre este assunto.
navigationBar.isTranslucent
comofalse
, caso contrário, funciona bem.Respostas:
Isso se deve à nova propriedade
UIScrollView's
(UITableView é uma subclasse de UIScrollview)contentInsetAdjustmentBehavior
, que é definida como.automatic
por padrão.Você pode substituir esse comportamento com o seguinte snippet no viewDidLoad de qualquer controlador afetado:
https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior
fonte
tableView.contentInsetAdjustmentBehavior
quebraria as inserções.contentInsetAdjustmentBehavior
como.never
não é uma ótima solução alternativa porque provavelmente terá outros efeitos colaterais indesejáveis. Se você usar uma solução alternativa, certifique-se de removê-la das versões iOS> = 11.2.Além da resposta de Maggy
OBJETIVO-C
fonte
Você pode editar esse comportamento de uma vez em todo o aplicativo usando NSProxy em, por exemplo, didFinishLaunchingWithOptions:
fonte
Veja como eu consegui corrigir esse problema e ainda permitir que o iOS 11 defina os insets automaticamente . Estou usando
UITableViewController
.tableView.insetsContentViewsToSafeArea = true
) - Pode não ser necessário, mas foi o que fiz.tableView.contentInsetAdjustmentBehavior = .scrollableAxes
) -.always
também pode funcionar, mas não testei.Outra coisa a tentar se tudo mais falhar:
viewSafeAreaInsetsDidChange
UIViewController
Método de substituição para obter a visualização da tabela para forçar a configuração das inserções da visualização de rolagem para as inserções da área segura. Isso ocorre em conjunto com a configuração 'Nunca' na resposta de Maggy.Nota:
self.tableView
eself.view
deve ser a mesma coisa paraUITableViewController
fonte
Isso parece mais um bug do que um comportamento pretendido. Acontece quando a barra de navegação não é translúcida ou quando a imagem de fundo é definida.
Se você apenas definir contentInsetAdjustmentBehavior como .never, as inserções de conteúdo não serão definidas corretamente no iPhone X, por exemplo, o conteúdo irá para a área inferior, sob as barras de rolagem.
É necessário fazer duas coisas:
1. evitar a animação do scrollView no push / pop
2. manter o comportamento .automático porque é necessário para o iPhone X. Sem isso, por exemplo, no retrato, o conteúdo irá abaixo da barra de rolagem inferior.
Nova solução simples: no XIB: Basta adicionar um novo UIView no topo de sua visualização principal com o topo, à esquerda e à direita para supervisualizar e a altura definida como 0. Você não precisa conectá-lo a outras subvisualizações nem nada.
Solução antiga:
Nota: Se você estiver usando UIScrollView no modo paisagem, ele ainda não define inserções horizontais corretamente (outro bug?), Então você deve fixar o início / fim de scrollView em safeAreaInsets em IB.
Nota 2: A solução abaixo também tem o problema de que se tableView for rolado para a parte inferior e você empurrar o controlador e voltar, ele não estará mais na parte inferior.
fonte
Posso reproduzir o bug do iOS 11.1, mas parece que o bug foi corrigido desde o iOS 11.2. Veja http://openradar.appspot.com/34465226
fonte
Certifique-se, juntamente com o código acima, de adicionar código adicional conforme segue. Resolveu o problema
fonte
Além disso, se você usar a barra de guias, a inserção de conteúdo inferior da visualização da coleção será zero. Para isso, coloque o código abaixo em viewDidAppear:
fonte
No meu caso, funcionou (coloque em viewDidLoad):
fonte
Removendo espaço extra na parte superior
collectionView
outableView
Acima do código
collectionView
outableView
sob a barra de navegação.O código abaixo impede que a visualização da coleção vá para a navegação
mas adoro usar a lógica e o código abaixo para o UICollectionView
A melhor maneira de UICollectionView
fonte
Excluir este código funciona para mim
fonte
Eu estava usando UISearchController com resultsControllers personalizados que tem visualização de tabela. Empurrar o novo controlador no controlador de resultados fez com que tableview fosse para pesquisa.
O código listado acima resolveu totalmente o problema
fonte