No novo iPhone X, qual seria a maneira mais adequada de obter altura superior e inferior para as áreas inseguras?
ios
iphone-x
safearealayoutguide
Tulleb
fonte
fonte
keyWindow
sempre foinil
assim que eu mudeiwindows[0]
e removi o?
encadeamento opcional e funcionou.Para obter a altura entre as guias de layout, basta
Assim
full frame height = 812.0
,safe area height = 734.0
Abaixo está o exemplo em que a vista verde possui um quadro de
guide.layoutFrame
fonte
UIApplication.sharedApplication.keyWindow.safeAreaLayoutGuide.layoutFrame
, que tem o quadro seguro.Swift 4, 5
Para fixar uma exibição em uma âncora de área segura, o uso de restrições pode ser feito em qualquer lugar do ciclo de vida do controlador de exibição, porque eles são enfileirados pela API e manipulados após o carregamento da exibição na memória. No entanto, para obter valores de área segura, é necessário aguardar o final do ciclo de vida de um controlador de exibição, como
viewDidLayoutSubviews()
.Isso se conecta a qualquer controlador de exibição:
Prefiro esse método a tirá-lo da janela (quando possível) porque é como a API foi projetada e, mais importante, os valores são atualizados durante todas as alterações de exibição, como alterações na orientação do dispositivo.
No entanto, alguns controladores de exibição apresentados personalizados não podem usar o método acima (suspeito porque estão em visualizações de contêiner transitório). Nesses casos, é possível obter os valores do controlador de exibição raiz, que sempre estará disponível em qualquer lugar do ciclo de vida do controlador de exibição atual.
fonte
viewDidLayoutSubviews
(que pode ser chamado várias vezes), aqui está uma solução que funcionará mesmo emviewDidLoad
: stackoverflow.com/a/53864017/7767664Nenhuma das outras respostas aqui funcionou para mim, mas isso funcionou.
fonte
Todas as respostas aqui são úteis. Obrigado a todos que ofereceram ajuda.
No entanto, como vejo que o tópico da área de segurança está um pouco confuso, o que não parece estar bem documentado.
Então eu vou resumi-lo aqui como mush possível para torná-lo fácil de compreender
safeAreaInsets
,safeAreaLayoutGuide
eLayoutGuide
.No iOS 7, a Apple introduziu as propriedades
topLayoutGuide
e , Eles permitiram criar restrições para impedir que seu conteúdo fosse oculto pelas barras do UIKit, como status, navegação ou barra de guias. oculto pelos elementos de navegação superior ou inferior (barras do UIKit, barra de status, barra de navegação ou tabulação…).bottomLayoutGuide
UIViewController
Então, por exemplo, se você deseja criar um tableView a partir da tela superior, você fez algo assim:
No iOS 11, a Apple substituiu essas propriedades, substituindo-as por um único guia de layout de área segura
Área segura de acordo com a Apple
Abaixo, uma área segura destacada no iPhone 8 e iPhone X-series:
O
safeAreaLayoutGuide
é uma propriedade deUIView
Para obter a altura de
safeAreaLayoutGuide
:Isso retornará a altura da seta na sua foto.
Agora, que tal obter as alturas dos indicadores superiores e inferiores da tela inicial?
Aqui vamos usar o
safeAreaInsets
A seguir, será mostrada a área insegura e a distância das bordas do iPhone 8 e de um do iPhone X-Series.
Agora, se a barra de navegação tiver sido adicionada
Então, agora como obter a altura da área insegura? vamos usar o
safeAreaInset
Aqui estão as soluções, porém elas diferem em algo importante,
Primeiro:
Isso retornará os EdgeInsets. Agora você pode acessar a parte superior e a parte inferior para conhecer as inserções,
O segundo:
O primeiro que você está visualizando, portanto, se houver uma barra de navegação, ela será considerada; no entanto, o segundo, você estará acessando o safeAreaInsets da janela, para que a barra de navegação não seja considerada
fonte
No iOS 11, existe um método que informa quando a área segura foi alterada.
fonte
Eu estou trabalhando com estruturas CocoaPods e no caso
UIApplication.shared
é indisponíveis então eu usosafeAreaInsets
na visão dewindow
:fonte
safeAreaLayoutGuide Quando a exibição é visível na tela, este guia reflete a parte da exibição que não é coberta por barras de navegação, guias, barras de ferramentas e outras exibições ancestrais. (No tvOS, a área segura reflete a área não coberta pelo painel da tela.) Se a visualização não estiver atualmente instalada em uma hierarquia de visualizações ou ainda não estiver visível na tela, as bordas da guia de layout serão iguais às bordas da visualização.
Então, para obter a altura da seta vermelha na captura de tela, é:
fonte
Swift 5, Xcode 11.4
Isso dará um aviso de descontinuação. '' keyWindow 'foi descontinuado no iOS 13.0: não deve ser usado para aplicativos que suportam várias cenas, pois retorna uma janela de chave em todas as cenas conectadas' por causa das cenas conectadas. Eu uso assim.
fonte
Objetivo-C Quem teve o problema quando keyWindow é igual a zero . Basta colocar o código acima em viewDidAppear (não em viewDidLoad)
fonte
fonte
Extensão Swift 5
Isso pode ser usado como uma extensão e chamado com: UIApplication.topSafeAreaHeight
A extensão do UIApplication é opcional, pode ser uma extensão do UIView ou o que for preferido, ou provavelmente uma função global ainda melhor.
fonte
Uma abordagem mais arredondada
fonte
Para aqueles que mudam para o modo paisagem, use o viewSafeAreaInsetsDidChange após a rotação para obter os valores mais atualizados:
fonte