Programação iOS

@elfo106, com o reloadData() acontece isso? Não sei o porquê, só mesmo vendo.

Eu por hábito uso o reloadData() porque ele actualiza todas as cells e não precisas de te chatear com muito. Neste contexto nem me lembrei do beginUpdates/endUpdates por não estares a alterar o dataSource. Normalmente isso usa-se nas seguintes funcionalidades
Código:
--- imagina que a tua tabela aqui usa como dataSource um array com 5 elementos e tem assim 5 rows ---

tableView.beginUpdates()

arrayOndeTensOsDados.remove(x)

tableView.deleteRows(at: ...

tableView.endUpdates()

Assim garante-te que o dataSource e a tabela estão actualizados. No entanto, admito que raramente uso esses métodos...
 
@Death_Knight Então com o reloadData() se o dataSource for alterado, essa alteração não é tida em conta aquando a actualização das cells?

De qualquer forma, assim de repente, isso não explica por si só a alteração do comportamento que vi.
 
Boa noite, preciso de mais uma ajudinha :)

Quero mudar a cor de fundo da cell quando é expandida e voltar à cor "normal" quando volta a ficar com apenas a label 1 visível.

Código:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
       
        guard let currentCell = tableView.cellForRow(at: indexPath) as? WodCell else { return }
       
        currentCell.changeState()

      //  let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
        if selectedCellIndexPath != nil && selectedCellIndexPath == indexPath {
           
            currentCell.backgroundColor = UIColor(red: 0.11, green: 0.10, blue: 0.10, alpha: 1.0)
            selectedCellIndexPath = nil
        } else {
            selectedCellIndexPath = indexPath
            currentCell.backgroundColor = UIColor(red:0.22, green:0.22, blue:0.22, alpha:1.0)
        }
        tableView.beginUpdates()
        tableView.endUpdates()

Já está quase mas não funciona 100%. Passo a explicar:

Se expandir uma cell e depois a fechar fica como quero, mas se expandir uma cell (cor muda...ok), expandir uma 2ª cell (cor muda...ok), quando for a encolher qualquer uma dessas duas cells, a cell encolhe mas a cor mantém-se como se estivesse expandida. Ao expandir novamente, fica com a cor que deveria ficar quando está encolhida.
 
@Death_Knight Já agora, como é que faço para reduzir o font size se o texto a colocar numa label for comprido demais para a largura da label? Já tentei o autoshrink mas nenhuma das opções funcionou...

Obrigado.
 
Boa noite, preciso de mais uma ajudinha :)

Quero mudar a cor de fundo da cell quando é expandida e voltar à cor "normal" quando volta a ficar com apenas a label 1 visível.

Código:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      
        guard let currentCell = tableView.cellForRow(at: indexPath) as? WodCell else { return }
      
        currentCell.changeState()

      //  let currentCell = tableView.cellForRow(at: indexPath)! as UITableViewCell
        if selectedCellIndexPath != nil && selectedCellIndexPath == indexPath {
          
            currentCell.backgroundColor = UIColor(red: 0.11, green: 0.10, blue: 0.10, alpha: 1.0)
            selectedCellIndexPath = nil
        } else {
            selectedCellIndexPath = indexPath
            currentCell.backgroundColor = UIColor(red:0.22, green:0.22, blue:0.22, alpha:1.0)
        }
        tableView.beginUpdates()
        tableView.endUpdates()

Já está quase mas não funciona 100%. Passo a explicar:

Se expandir uma cell e depois a fechar fica como quero, mas se expandir uma cell (cor muda...ok), expandir uma 2ª cell (cor muda...ok), quando for a encolher qualquer uma dessas duas cells, a cell encolhe mas a cor mantém-se como se estivesse expandida. Ao expandir novamente, fica com a cor que deveria ficar quando está encolhida.

Isso está aí uma complicação... Parece-me que o teu problema está no selectedCellIndexPath, ao selecionares a 2a tens problemas.

@Death_Knight Já agora, como é que faço para reduzir o font size se o texto a colocar numa label for comprido demais para a largura da label? Já tentei o autoshrink mas nenhuma das opções funcionou...

Obrigado.

Reduzir o fontsize ou meter a label com duas linhas? Tem mesmo que ser o fontsize reduzido?
 
Isso está aí uma complicação... Parece-me que o teu problema está no selectedCellIndexPath, ao selecionares a 2a tens problemas.

Sim, dá problemas ao selecionar a 2a. Que alternativa tenho?


Reduzir o fontsize ou meter a label com duas linhas? Tem mesmo que ser o fontsize reduzido?

Não tem mesmo que ser. Também já tentei colocar o lines a 0 mas continua com 1 linha e corta o texto quando é grande.
Entretanto apercebi-me que no xcode quando no texto da label ponho um texto mais comprido ele faz resize à font para caber mas na simulação ao ir buscar o texto ao json simplesmente mantém o tamanho e corta o texto.
 
Sim, dá problemas ao selecionar a 2a. Que alternativa tenho?

Quantas queres? :p

Eu aconselhava uma abordagem diferente, vai lá ao repositório do GitHub que aqui coloquei no outro dia porque fiz push de outra maneira (envolvendo duas cells diferentes) para atingires o que queres. Eu, provavelmente, iria para algo deste estilo. Também coloquei um label que se expande, e bem, na cell expandida.

Não tem mesmo que ser. Também já tentei colocar o lines a 0 mas continua com 1 linha e corta o texto quando é grande.
Entretanto apercebi-me que no xcode quando no texto da label ponho um texto mais comprido ele faz resize à font para caber mas na simulação ao ir buscar o texto ao json simplesmente mantém o tamanho e corta o texto.

A label tem o width máximo definido? A altura é estática? Se a altura for dinâmica e o width tiver um certo máximo, com a label com as lines = 0, ela tem que se adaptar.
 
Quantas queres? :p

Eu aconselhava uma abordagem diferente, vai lá ao repositório do GitHub que aqui coloquei no outro dia porque fiz push de outra maneira (envolvendo duas cells diferentes) para atingires o que queres. Eu, provavelmente, iria para algo deste estilo. Também coloquei um label que se expande, e bem, na cell expandida.

Vou já ver de seguida. Obrigado!


A label tem o width máximo definido? A altura é estática? Se a altura for dinâmica e o width tiver um certo máximo, com a label com as lines = 0, ela tem que se adaptar.

A largura está definida numa constraint, a altura não. Eu testei 2 situações:

1 - lines = 1, Minimum font scale = 0,5 (tentei 0,2 também)
Na simulação o font size mantém-se o default e quando o texto é mais comprido que a width da label, fica cortado. No xcode, se no text da label escrever algo muito comprido, assim que clico fora da label, ele faz o scale.

2 - lines = 0 com fixed font size corta sempre o texto.
 
A largura está definida numa constraint, a altura não. Eu testei 2 situações:

1 - lines = 1, Minimum font scale = 0,5 (tentei 0,2 também)
Na simulação o font size mantém-se o default e quando o texto é mais comprido que a width da label, fica cortado. No xcode, se no text da label escrever algo muito comprido, assim que clico fora da label, ele faz o scale.

2 - lines = 0 com fixed font size corta sempre o texto.

Novamente, vê o que coloquei no GitHub. Se fores ao Storyboard a label apenas tem 1 linha, quando a mando ficar com aquele texto gigante, ela adapta-se e leva a cell atrás.
 
Olá, eu ontem à noite dei uma vista de olhos mas hoje vou ver com mais atenção e tentar implementar. Pelo que eu percebi, tu criaste 2 cells (smart cell e a expandable) e depois no didselect substituis uma pela outra. Usas as constraints para fazer com que ela cresça à medida do texto. Vi bem?

No meu caso, o que não me está a caber correctamente é a que tu chamas de smart cell mas é uma questão de eu adaptar.
 
Boa noite,

Tenho uma label com o autoshrink activo no UI do xcode. É suposto que se mudar o texto dessa label programaticamente e esse texto for muito comprido, o autoshrink entre em acção? Aqui só está a funcionar com labels demasiado compridas que já vêm com o texto definido no UI do xcode.
 
@elfo106

Como estás a mudar o texto programaticamente? Pode ser que tenhas que invocar setNeedsLayout() na label para o motor do AutoLayout dar conta da mudança e adaptar as subviews correspondentes.
 
@Lucien, já consegui mas acabei por passar o texto a duas linhas quando necessário. Afinal parece-me que visualmente fica melhor neste caso.

Alguém me explica como posso mudar o aspeto visual de um picker? Onde posso encontrar que parâmetros visuais se podem alterar e como se alteram?
 
@elfo106

O UIPickerView nativo não é muito personalizável, mas podes sempre usar uma alternativa open-source que fornece uma API para mudares ao teu gosto.

Eis um exemplo.

P.S. Se nunca trabalhaste com componentes open-source em projetos iOS, agora é uma boa maneira para começar, até porque abre um mundo de opções. Usa o CocoaPods como gestor de dependências (ajuda-te muito).
 
@elfo106

O UIPickerView nativo não é muito personalizável, mas podes sempre usar uma alternativa open-source que fornece uma API para mudares ao teu gosto.

Eis um exemplo.

P.S. Se nunca trabalhaste com componentes open-source em projetos iOS, agora é uma boa maneira para começar, até porque abre um mundo de opções. Usa o CocoaPods como gestor de dependências (ajuda-te muito).

Ou, mais engraçado ainda, seria ele fazer o seu próprio picker e colocá-lo open source e disponível através de Carthage e CocoaPods :D

Obrigado pelo exemplo OpenSource. Então se eu quisesse ser engraçado :) Por onde teria que começar??
 
Eu até te digo como podias começar:

- Criar uma custom view (classe e .xib)
- Nessa custom view colocas uma table view com constraints para ser do tamanho da view em si
- A custom view precisa de um delegate e de um datasource (para alimentar o data source da table e para dizer à view que a chamou o que selecionaste)

Bonus points:

- Ter diversos tipos de picker (ie.: single e multiple selection, com e sem imagens, etc)
 
Eu até te digo como podias começar:

- Criar uma custom view (classe e .xib)
- Nessa custom view colocas uma table view com constraints para ser do tamanho da view em si
- A custom view precisa de um delegate e de um datasource (para alimentar o data source da table e para dizer à view que a chamou o que selecionaste)

Bonus points:

- Ter diversos tipos de picker (ie.: single e multiple selection, com e sem imagens, etc)

Obrigado! Porquê table view??
 
Back
Topo