Para esclarecer o objetivo desta pergunta: Eu sei como criar visualizações complicadas com ambas as subvisões e usando o drawRect. Estou tentando entender completamente o quando e por que usar um sobre o outro.
Também entendo que não faz sentido otimizar isso muito antes do tempo e fazer algo da maneira mais difícil antes de fazer qualquer criação de perfil. Considere que estou confortável com os dois métodos e agora realmente quero um entendimento mais profundo.
Muita confusão vem de aprender como tornar o desempenho de rolagem de exibição de tabela muito suave e rápido. É claro que a fonte original desse método é do autor por trás do twitter para iPhone (anteriormente tweetie). Basicamente, diz que, para tornar a rolagem da mesa mais suave, o segredo é NÃO usar subviews, mas fazer todo o desenho em uma visualização personalizada. Essencialmente, parece que o uso de muitas subvisões diminui a renderização porque elas têm muita sobrecarga e são constantemente recompostas nas visualizações pai.
Para ser justo, isso foi escrito quando o 3GS era bastante novo, e os iDevices ficaram muito mais rápidos desde então. Ainda assim, esse método é sugerido regularmente nas interwebs e em outros lugares para tabelas de alto desempenho. Na verdade, é um método sugerido no Table Sample Code da Apple , foi sugerido em vários vídeos da WWDC ( desenho prático para desenvolvedores de iOS ) e em muitos livros de programação para iOS .
Existem ainda ferramentas incríveis para projetar gráficos e gerar o código de gráficos principais para eles.
Então, no começo, sou levado a acreditar que "existe uma razão pela qual o Core Graphics existe. É RÁPIDO!"
Mas assim que penso que recebo a idéia "Favorecer gráficos principais quando possível", começo a perceber que o drawRect geralmente é responsável pela falta de resposta em um aplicativo, é extremamente caro em termos de memória e realmente sobrecarrega a CPU. Basicamente, eu deveria " Evitar substituir o drawRect " ( Desempenho do aplicativo iOS da WWDC 2012 : gráficos e animações )
Então eu acho que, como tudo, é complicado. Talvez você possa ajudar a mim e a outras pessoas a entender os quando e por que usar o drawRect?
Vejo algumas situações óbvias para usar o Core Graphics:
- Você tem dados dinâmicos (exemplo do gráfico de ações da Apple)
- Você tem um elemento de interface do usuário flexível que não pode ser executado com uma imagem redimensionável simples
- Você está criando um gráfico dinâmico que, uma vez renderizado, é usado em vários locais
Vejo situações para evitar gráficos principais:
- As propriedades da sua visualização precisam ser animadas separadamente
- Você tem uma hierarquia de exibição relativamente pequena, portanto, qualquer esforço extra percebido usando o CG não vale o ganho
- Você deseja atualizar partes da vista sem redesenhar a coisa toda
- O layout de suas subvisões precisa ser atualizado quando o tamanho da visualização principal for alterado
Portanto, conceda seu conhecimento. Em que situações você alcança o drawRect / Core Graphics (que também pode ser realizado com subvisões)? Quais fatores levam você a essa decisão? Como / por que o desenho em uma exibição personalizada é recomendado para rolagem suave de células da tabela, mas a Apple recomenda o drawRect por razões de desempenho em geral? E as imagens de fundo simples (quando você as cria com CG vs usando uma imagem png redimensionável)?
Talvez não seja necessário um entendimento profundo desse assunto para criar aplicativos que valham a pena, mas não gosto de escolher entre técnicas sem poder explicar o porquê. Meu cérebro fica bravo comigo.
Pergunta Update
Obrigado pela informação a todos. Algumas perguntas esclarecedoras aqui:
- Se você está desenhando algo com gráficos principais, mas pode realizar o mesmo com UIImageViews e um png pré-renderizado, sempre deve seguir esse caminho?
- Uma pergunta semelhante: especialmente com ferramentas duras como esta , quando você deve considerar desenhar elementos de interface em gráficos principais? (Provavelmente quando a exibição do seu elemento é variável. Por exemplo, um botão com 20 variações de cores diferentes. Algum outro caso?)
- Dado o meu entendimento na minha resposta abaixo, os ganhos de desempenho de uma célula de tabela poderiam ser obtidos capturando efetivamente um bitmap de instantâneo da sua célula após a renderização do UIView complexo e exibindo-o enquanto rolava e oculta a visualização complexa? Obviamente, algumas peças teriam que ser trabalhadas. Apenas um pensamento interessante que tive.