Como inspeciono a hierarquia de exibição no iOS?


170

Existe uma ferramenta da GUI que inspeciona a hierarquia de exibição de um aplicativo iOS? Estou pensando no inspetor da Web do Webkit ou em ferramentas similares. Estou procurando depurar problemas de layout, como visualizações com a posição ou tamanho incorretos ou um filho que não esteja adequadamente contido no pai. Atualmente, tenho que adicionar afirmações que testam essas várias condições manualmente ou definir diferentes cores de plano de fundo em diferentes visualizações e, como você pode imaginar, é uma maneira realmente tediosa de fazer isso.

Eu olhei para a Instruments UI recorder, mas isso apenas grava e reproduz ações da interface do usuário e, em qualquer caso, funciona apenas para aplicativos Mac.

Existe uma solução melhor?

Respostas:


168

O Xcode 6 agora possui inspeção de hierarquia de exibição em 3D, como Reveal App e Spark Inspector.

insira a descrição da imagem aqui

Clique no botão "Hierarquia de exibição de depuração" enquanto o aplicativo está em execução para pausar a execução e inspecionar as visualizações no momento atual.

insira a descrição da imagem aqui

Mais informações na documentação da Apple .


5
Se a opção de visualização de depuração não estiver disponível, consulte stackoverflow.com/questions/24040322/… .
Kennytm

No começo, não vi a barra de ferramentas mostrada por Levi McCallum porque fica na parte inferior da janela do Xcode, se o aplicativo não tiver saída de depuração. E assim que o botão é pressionado, a janela Hierarquia de exibição fica em branco até eu pressionar um dos botões na parte inferior ou ajustar um dos controles deslizantes.
Carl Smith

Uma vez que você começa a confiar nessa ferramenta, ela sempre se espalha. Não sei por que ou como corrigi-lo, mas parece acontecer em visões mais complicadas.
Departamento B

263

Não sei se existe uma ferramenta de inspeção de exibição da GUI, mas tive alguma sorte com o método de depuração no UIView: -recursiveDescription

se você pausar o programa no depurador e inseri-lo no GDB (Editar: também funciona no LLDB)

po [[UIWindow keyWindow] recursiveDescription]

Você obtém uma impressão de toda a hierarquia de visualizações. Você também pode chamá-lo em uma visão específica para obter uma impressão da hierarquia da visão dessa visão.

Pode ser um pouco entediante vasculhar as informações que você obtém, mas isso se mostrou útil para mim.

O crédito vai para este post do blog que falou sobre esse método e também está vinculado a este útil, mas bastante difícil de encontrar nota técnica da Apple .


1
Eu tenho: error: não é possível encontrar declaração de interface para '$ __ lldb_objc_class' alguma idéia? (lldb) po [[UIWindow keyWindow] recursiveDescription] erro: não é possível encontrar a declaração da interface para o erro '$ __ lldb_objc_class': não é possível encontrar a declaração da interface para o erro '$ __ lldb_objc_class': 2 erros ao analisar a expressão
Zennichimaro

1
Acredito que essa resposta não seja mais a resposta canônica, pois agora existem ferramentas GUI disponíveis que respondem diretamente à pergunta 'Existe uma ferramenta GUI ...?'
theraven 31/07

iniciando com xcode 5.1 Comecei a receber esse erro sempre que digito recursiveDescription error: o método da instância 'undoManager' possui tipos de resultados incompatíveis em diferentes unidades de tradução ('id' vs. 'NSUndoManager *'). Observação: o método da instância 'undoManager' também declarou aqui o erro : 1 erros ao analisar a expressão
abbood

1
Enquanto a pergunta é antiga e pergunta sobre métodos gráficos, essa resposta específica se refere a soluções textuais. Uma discussão da solução canônica em código pode ser encontrada, por exemplo, aqui: stackoverflow.com/a/14193682/2431627 . ou seja, usando a propriedade _printHierarchy via KVC.
Robin Macharg 12/03/19

46

Revelar a captura de tela do aplicativo

Por incrível que pareça, agora existe outra opção, http://revealapp.com/ , que até agora está disponível em uma versão beta aberta (gratuita). Como você pode ver, é outro inspetor visual.

EDIT 05-04-2014: Reveal saiu da versão beta e não é mais gratuito. Há um teste de 30 dias, no entanto.


1
Eu tentei algumas ferramentas para isso (Spark Inspector, iOS Hierarchy Viewer e a visualização semelhante a firebug na ferramenta de teste de Frank). Até agora Revelar é o meu favorito.
Stew

1
Mas TOTALMENTE ainda vale a pena. Muito melhor do que o construído em ferramentas Xcode para a visualização de pontos de vista
Will Larche

35

Esta pergunta é antiga, mas deixe-me colocar informações aqui sobre a nova ferramenta que desenvolvo: https://github.com/glock45/iOS-Hierarchy-Viewer insira a descrição da imagem aqui


é possível atualizar a página automaticamente quando eu navego para outra visualização no simulador? além disso, é possível alterar valores nesse visualizador (para que eu possa fazer alguns testes no navegador sem escrever código real)? Obrigado :)
Brian

1
@ Brian graças Cérebro. Comecei a prototipar a possibilidade de alterar valores. Está desativado no lançamento oficial. Fique ligado !
Damian Kołakowski 5/11

Muito obrigado pela sugestão. Consegui resolver meu problema com esta ferramenta, um problema que não conseguia resolver usando o depurador da interface do usuário do Xcode!
D6mi

Obrigado, Damian, mas para as pessoas que estão lendo isso, essa ferramenta parece não mantida.
Vaddadi Kartick



6

Gratuito: basta digitar isso no inspetor:

po [[UIWindow keyWindow] recursiveDescription]

Comercial: http://revealapp.com/ Testei a versão beta do Revelapp, era bom que tenha bugs. Outra ferramenta comercial: http://sparkinspector.com/ está funcionando perfeitamente.


O Spark Inspector possui um ótimo visualizador de notificações
thierryb

6

Swift 4.

iOS :

extension UIView {

   // Prints results of internal Apple API method `recursiveDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("recursiveDescription"))))
   }
}

macOS :

extension NSView {

   // Prints results of internal Apple API method `_subtreeDescription` to console.
   public func dump() {
      Swift.print(perform(Selector(("_subtreeDescription"))))
   }
}

Uso (no depurador): po myView.dump()


2

Isso despeja tudo na janela de depuração. (Difícil de ler) :( Trabalhando no iOS 10, Xcode 8.3.3

po UIApplication.shared.keyWindow?.recursiveDescription()

0

A resposta aprovada não funciona mais para mim, usando o Xcode 8 e o Swift 2.3. Aqui está o que funciona para mim:

po UIApplication.sharedApplication().keyWindow?.recursiveDescription()


1
Obrigado, mph, mas isso também não funciona no Swift 3: erro: a propriedade 'shared' não foi encontrada no objeto do tipo 'UIApplication'
Vaddadi Kartick 9/17/17 /

Swift 4 e Xcode 9.1 reclamam com "error: <PRESS>: 3: 32: error: não é possível chamar o valor do tipo não funcional 'UIApplication' UIApplication.sharedApplication (). KeyWindow? .RecursiveDescription ()"
Jason Harrison

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.