Desenhando um gráfico de barras simples com Core Graphics

Eloisa Falcão
Zero e Umas
Published in
4 min readMar 26, 2020

Core Graphics é um framework da Apple pensado parar desenhar em Swift. Apesar de parecer simples, é uma ferramenta muito potente podendo ser usada com inúmeros propósitos diferentes. Nesse tutorial, vamos dar os primeiros passos em relação a Core Graphics enquanto desenvolvemos um gráfico simples de barras.

Caso queira acompanhar com o projeto, é possível ter acesso clicando aqui.

O primeiro passo é criar um objeto context, ele é o “ambiente” onde a magia acontece, e o desenho é criado

Um gráfico de barras, do ponto de vista visual, nada mais é do que retângulos alinhados, por isso o primeiro passo é aprender como desenhar um retângulo, que futuramente será uma barra.

Lembrando que CGRect é só um dos tipos pensados para desenho geométrico, é possível desenhar qualquer forma usando CGPoint, CGSize, CGVector dentre outros.

Gráficos são maneiras visuais de interpretar dados, por isso, por hora, um for loop simples, vai povoar o nosso array de values, que serão os dados apresentados nos gráficos.

E como cada value equivale ao valor de uma barra, vamos usar um .forEach para percorrer o vetor e construir um retângulo para cada valor. Gráficos de barra representam de maneira comparativa diferentes valores, por isso, cada value vai ser a height de uma barra. Mas se você rodar o projeto agora, seguindo só o que falei, vai perceber um grande problema, só há uma barra em tela.

O zero se encontra no canto superior esquerdo, o X aumenta a medida que vai para a direita e o Y aumenta a medida que vai para baixo.

Na verdade, existem várias barras, mas elas estão na mesma posição, por isso se sobrepõem. Por isso vamos alinhar as barras lado a lado. Com a variável posX, que se inicia em zero, já que queremos que os gráficos comecem no canto da tela. Para entender melhor as coordenadas na tela do iPhone, é só dar uma olhada na imagem ao lado.

Toda vez dentro do .forEach que se terminar de desenhar uma barra, a posX precisa incrementar a largura da barra(var barWidht) mais um fator para dar um espaçamento entre elas, dessa forma, elas vão se alinhar lado a lado.

Ainda pensando em como são as coordenadas no iPhone, o Y incrementa para baixo, por isso, quando rodar o projeto, o seu gráfico de barras vai estar de ponta cabeça. Por isso precisamos “empurrá-las” para baixo.

Gráfico de barras crescente para baixo
Em azul, a quantidade que queremos “empurrar”de cada gráfico

A lógica para isso é bem simples, sabemos que o tamanho da view menos a altura dos gráficos(em vermelho) é a quantidade que queremos “empurrar”para baixo, aí é só fazer a matemática.

Agora que já temos a altura de cada barra(value), a largura(barWidht), a posição em X(posX) e a posição em Y(postY) é só subtituir os valores em bar.

Agora é só rodar o projeto e o resultado vai ser esse:

Gráfico de barras crescente, com as barras no sentido certo.

Por enquanto, estamos trabalhando com values pequenos, que estão dentro das dimensões da tela do iPhone. Mas é só começar a testar valores altos, que vamos perceber o seguinte comportamento:

Barras saindo da tela

As barras estão tão grandes que agora elas saem da tela, por isso precisamos normalizar esses dados. E para isso vamos rebuscar um conhecimento do Ensino Médio, que é o calculo de conversão entre escalas termométricas.

Basicamente, o que precisamos é saber qual o menor e qual o maior valor dentro do array de valores, através das funções min() e max(). Isso porque vamos converter esses valores para 0 e 1, respectivamente.

Com o cálculo claro na cabeça, é só substituir no código. Por fim, para que as barras tenham o tamanho certo, é só multiplicar o valor nomalizado (normalizedValue) pelo tamanho da view, assim, independente do valor de cada barra, elas vão se ajustar proporcionalmente em tela.

Agora suas barras vão estar alinhadas, normalizadas e com a proporção certa.

Gráfico de barras, ajustado

Ufa, estamos quase no fim, agora é adicionar as legendas.

Mas assim que adicionamos as legendas dois problemas aparecem de cara, uma barra cujo valor é 30, esta visualmente errada, ela aparece como 0 . E a legenda do útimo valor está pulando para fora da view do gráfico.

Aqui, nós percebemos que o gráfico, para se manter normalizado, tem dois comportamentos, um quando o menor valor é zero, e um quando o menor valor é diferente de zero. Por isso, vamos reaplicar a lógica usada para normalizar o gráfico, só que agora de duas maneiras diferentes.

Agora que você sabe o básico, é só explorar mais essa framework incrementado seu gráfico com mais elementos visuais. Para isso a documentação da Apple é o melhor caminho.

Obrigada :)

--

--