/ / Como realizar o redimensionamento do NSTableCellView com base no tamanho do seu NSTextField? - objetivo-c, macos, cacau, nstableview

Como realizar o redimensionamento do NSTableCellView com base no tamanho de seu NSTextField? - objetivo-c, macos, cacau, nstableview

Eu sei que em uma exibição de tabela baseada em exibição, a linhaclasse NSTableCellView do NSView. Esta classe contém duas propriedades, um NSTextField e um NSImageView. Estou usando apenas o NSTextField sem uma visualização de imagem. No entanto, algumas células na minha exibição de tabela devem conter várias linhas de texto, enquanto outras podem conter apenas uma ou duas linhas. Eu preciso ser capaz de redimensionar modos de exibição NSTableCellView individuais, dependendo do tamanho de sua propriedade textField NSTextField.

Portanto, eu precisava fazer o seguinte:

  1. Obtenha o frameSize do NSTextField na exibição da célula da tabela.
  2. Defina o frameSize do NSTableCellView como frameSize do NSTextField (o que obtivemos no conjunto um)

No entanto, essa abordagem não está funcionando. Comecei a pensar que minha abordagem para redimensionar o NSTableCellView está incorreta. Aqui está o código que estou usando:

[tableCellView setFrameSize:[[tableCellView textField] frame].size];
[tableCellView setNeedsDisplay:YES];

Existe algum problema com essa abordagem? Eu esperaria que a célula fosse redimensionada, mas isso não acontece? O que está acontecendo de errado?

Obrigado.

Respostas:

2 para resposta № 1

[edit] Eu deveria começar comentando que o tamanho do campo de texto tem pouco a ver com o tamanho necessário para exibir todo o seu conteúdo.

Eu uso esse código para determinar a altura de uma string com base na largura de uma célula da tabela:

- (CGFloat) displayStringHeightWithWidth:(CGFloat)width
{
CGSize size = NSMakeSize(width,0);
NSRect bounds = [self.displayString boundingRectWithSize:size
options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading];
return bounds.size.height;
}

Idealmente, você pode adaptar isso para encontrar a altura do textField.stringValue ou textField.attributedStringValue. Não que o acima seja também do OSX, não do iOS, então YMMV em alguns dos cotões.

Portanto, isso altera seu algoritmo para:

  1. Obter a largura da coluna da tabela
  2. Obter a altura do retângulo delimitador necessário para o texto do campo de texto
  3. Diga à tabelaVer que a altura da linha é o que você encontrou em 2

Agora. Em relação a # 3. Eu acredito que você ter para usar o tableView: heightOfRow: no protocolo NSTableViewDelegate, além de chamar o noteHeightOfRowsWithIndexesChanged da tabela: para que as alturas das linhas sejam alteradas. O tableView não sabe que a altura do seu celular foi alterada. Observe a discussão na documentação. Pode ser que seu método funcione sem o delegado e apenas diga à tabela que as alturas das linhas que você está alterando estão sujas ... mas eu realmente não esperava.