Pergunta

Estou quase pronto para começar a criar um gráfico de Gantt como controle no iOS para meu aplicativo.Preciso mostrar uma linha do tempo dos eventos.Basicamente, um monte de retângulos, algumas linhas/arcos para alguma decoração, possivelmente um ou dois pontos de toque para editar atributos.Será basicamente um controle de “tela cheia” no meu telefone.

Vejo dois caminhos básicos para implementar esta subclasse UIView personalizada:

  1. Simplesmente implemente drawRect: e ir para a cidade usando CoreGraphics chamadas.Provavelmente dividido em vários métodos privados que fazem todo o trabalho de desenho.Possivelmente armazene em cache algumas informações conforme necessário, para ajudar na detecção de ocorrências de qualquer sub-região.

  2. Em vez de "desenhar" os gráficos, adicione vários UIViews como filhos usando addSubview: e manipulando seus layer propriedades para fazê-los mostrar as diferentes peças gráficas, e bounds\frame para posicioná-los adequadamente.E então deixe o "desenho" cuidar de si mesmo.

Um caminho é melhor que o outro?Posso acabar tentando os dois no longo prazo só para ver, mas decidi buscar primeiro a sabedoria daqueles que já passaram.

Meu adivinhar é esse o mais rápido a solução seria ir drawRect: rota, e a abordagem de subvisão exigiria mais código, mas talvez fosse mais robusta (detecção de acertos mais fácil, suporte a animação, gerenciamento automático de recorte, etc.).Eu quero ser capaz de implementar beliscar para ampliar e assim por diante, a longo prazo.

ATUALIZAR

Eu fui com o UICollectionView abordagem.O que me permitiu selecionar e rolar de graça (depois de algumas surpresas).Estou bastante satisfeito com os resultados até agora.

Foi útil?

Solução

Adotar CoreGraphics forçará você a escrever muito mais linhas de código do que construir com UIViews, embora tenha melhor desempenho e melhor memória.No entanto, você provavelmente precisará de uma solução mais robusta para gerenciar todo esse conteúdo.A UICollectionView parece uma solução apropriada para mapear seus dados para uma visualização com um personalizado UICollectionViewCell subclasse.Isso será muito mais rápido de desenvolver do que criar o seu próprio e vem com grande flexibilidade por meio de UICollectionViewLayout subclasses.Apertar para ampliar não é compatível imediatamente, mas há maneiras de fazer isso.Isso também é melhor para a memória do que usar vários UIViews devido à reutilização de células, mas o recarregamento pode se tornar lento com algumas centenas de itens, todos com tamanhos diferentes para serem calculados.

Outras dicas

Quando se trata de desempenho, um texto bem escrito drawRect: é preferido, especialmente quando você potencialmente teria que renderizar muitos retos.Com visualizações, todo um sistema de layout funciona, muito pior se você tiver autolayout, onde todo um sistema de layout vai para a cidade e prejudica seu desempenho.Recentemente, atualizei nossas visualizações de calendário de baseadas em visualização para baseadas em CG por motivos de desempenho.

Em todos os outros aspectos, é preferível trabalhar com visualizações, é claro.Interface Builder, configuração fácil de reconhecedor de gestos, OO, etc.Você ainda pode criar classes lógicas para cada elemento e fazer com que ele se desenhe no contexto atual (melhor passar uma referência de contexto e desenhar sobre ela), mas ainda não tão simples.

Em dispositivos mais recentes, o desempenho do desenho de visualização é bastante alto, na verdade.Mas se você quiser esses dispositivos iPhone 4 e 4S, se quiser esses dispositivos iPad 3, que carecem bastante de desempenho de GPU, eu diria que, dependendo do tamanho potencial de seus gráficos, talvez você precise seguir o caminho CG.

Agora, você mencionou apertar para ampliar.Isso é uma vadia, não importa o que aconteça.Se você escrever seu drawRect: bem, você poderia eventualmente trabalhar no lado a lado e trabalhar com isso.

Se você planeja permitir que o usuário mova partes do gráfico, eu definitivamente sugeriria usar as visualizações.

Para sua informação, você será capaz de manipular o pinçamento para ampliar com drawRect perfeitamente.

O que me levaria a usar UIView neste caso seria suportar arrastar partes do gráfico, animar transições no gráfico e tocar em elementos do gráfico (embora isso não fosse muito difícil com drawRect :).Além disso, se você tiver elementos em seu gráfico que precisarão de uso intenso de CPU para renderizar, você obterá melhor desempenho se precisar redesenhar subpartes de seu gráfico com UIView, já que a renderização dos elementos é armazenada em cache em uma camada e você só precisará para redesenhar as peças de seu interesse e não o gráfico inteiro.

Se seu gráfico for MUITO grande E você quiser usar drawRect:você provavelmente desejará usar CATileLayer para fazer backup, de modo que não tenha a camada inteira na memória.Isso pode adicionar desafios adicionais se você quiser renderizar apenas os blocos solicitados e não a área inteira.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top