Criando um calendário semanal dinâmico em UIKit

Carolina Ortega
Apple Developer Academy | Mackenzie
5 min readJun 16, 2022

Você já precisou de um calendário para seu aplicativo e não sabia por onde começar? Ou como seria possível criar uma lógica que saiba exatamente qual é o dia de hoje? Vem que eu te ajudo!

Photo by Behnam Norouzi on Unsplash

Neste artigo você aprenderá como fazer um calendário semanal (muito parecido com o calendário nativo do iOS) em UIKit.
Já adiantando, trabalharemos no início com Storyboard para criar toda a parte visual do calendário e a lógica será feita via código.

No Storyboard

Formatando a View

1. Adicione uma UIView na sua UIViewController e adicione as constraints necessárias.

Sugestão: Se quiser facilitar a visualização, coloque uma cor de background na UIView.

Adicionando os elementos

1. Adicione uma Stack View Horizontal dentro da sua UIView. Faça isso de maneira que a Stack ocupe quase toda a View.

Sugestão: Para facilitar, renomeie essa Stack para "Calendar".

2. Adicione uma Stack View Vertical dentro da Stack "Calendar".
Tenha o cuidado de verificar a hierarquia dos objetos, precisamos que uma Stack esteja dentro da outra.

Sugestão: Para facilitar, renomeie essa Stack para "Day".

3. Adicione uma UILabel e um UIButton na Stack "Day", não se preocupe com as constraints por enquanto.

Agora você pode alterar os textos dos elementos e personalizá-los do jeito que preferir. Uma sugestão:

  • UILabel: System Semibold 17.0 na cor Tertiary Label Color.
  • UIButton: System 15.0 na cor Default (Label Color).

4. Para não precisar fazer esse mesmo processo para os próximos dias, você irá selecionar a Stack "Day" e copiá-la 6 vezes.

Personalizando os elementos

Agora para que tudo funcione direitinho, precisamos ajustar o espaçamento dos objetos. Podemos corrigir isso selecionando o Attributes Inspector da Stack.

1. Selecione a Stack "Calendar" altere a distribuição dos elementos para Equal Spacing, isso fará com que o espaço entre elas seja igual.

2. Selecione todas as Stacks "Day" e altere a distribuição dos elementos para Fill Equally.

Você terá algo mais ou menos assim:

3. Para que o calendário fique mais parecido com o calendário nativo iOS, vamos aplicar um arredondamento nos números.

Selecionando o Identity Inspector você consegue adicionar um atributo para o botão.

O nome do atributo é "cornerRadius", exatamente desse jeito, sem espaço e com letra maiúscula. O tipo dele é "Number" e o valor fica a seu critério.

Para o arredondamento funcionar da maneira correta, é necessário que o tamanho do botão seja o mesmo para altura e largura.
Sugestão: Width = 46 e Height = 46, com cornerRadius = 23.

Agora que a parte visual está pronta, vamos tornar esse calendário dinâmico.

No Código

Iremos trabalhar somente com o arquivo ViewController.swift.

Conectando os elementos e criando variáveis

1. Adicione as referências de todos os Botões.
Não é necessário fazer esse processo com as Labels já que elas são estáticas, os únicos valores que irão mudar são os valores dos números.

Sugestão: Você pode fazer isso selecionando no objeto com o botão "control", arrastando para o código e renomeando o outlet.

2. Quando terminar, crie uma lista com todos estes botões, a sua ViewController estará assim:

3. Agora iremos criar as variáveis que irão nos ajudar a saber qual dia, mês e ano estamos. Estes valores já estão disponíveis na estrutura de Calendar na biblioteca de UIKit.

4. Para dar destaque ao dia atual no calendário, faremos uma pequena personalização nele (utilize a cor que você quiser)

Lógica do calendário

Agora, a parte mais difícil é tratar a lógica do calendário. A função a seguir realiza os seguintes passos:

Para saber os próximos dias:

Verifica se o mês atual possui 31, 30 ou 28/29 dias (Fevereiro).

  • Se o mês atual possui 31 dias, ele limita os dias do mês para 31.
  • Se o mês atual possui 30 dias, ele limita os dias do mês para 30.
  • Se o mês atual for Fevereiro (exceção):
    1. Ele verifica se o ano é bissexto.
    2. Se sim, ele limita os dias do mês de fevereiro para 29.
    3. Se não, ele limita os dias do mês de fevereiro para 28.

Ele faz o mesmo processo para saber os dias anteriores, porém a lógica funciona para o dia anterior, não o atual.

Não esqueça de chamar essa função no seu viewDidLoad():

Caso for necessário para o seu aplicativo, é possível criar ações para cada dia do ano (por isso utilizamos UIButtons para os números).

Agora você tem um calendário semanal dinâmico para seu aplicativo!

Você pode visualizar o projeto final no meu GitHub :)

--

--