2014-06-13 1 views
6

J'ai une mise en page simple, qui se compose de NSView et de sa sous-vue NSTextView. NSTextView est rempli par programme avec du texte qui génère plusieurs lignes. Je lie tout ensemble en utilisant la mise en page automatique (tout est fait par programmation). Cependant, lorsque tout est affiché, NSTextView est coupé, une seule ligne est affichée.NSTextView ne pas redimensionner correctement avec mise en page automatique

Après une recherche sur le web, la meilleure réponse que je pouvais trouver était:

Using Autolayout with expanding NSTextViews

Cependant, cela ne fonctionne que si je change manuellement le texte dans NSTextView après tout est affiché (ce qui est pas vraiment mon utilisation Cas). Les vues sont réajustées et l'intégralité de NSTextView est affichée. J'essaie de comprendre quand NSViewController est terminé avec la mise en page des sous-vues afin que je puisse appeler invalidateIntrinsicContentSize sur le NSTextView. L'équivalent de viewDidLayoutSubviews dans UIViewController.

Rien que j'ai essayé travaillé jusqu'à présent. Je TENTATIVE appelle invalidateIntrinsicContentSize pour NSTextView:

  • A la fin de loadView
  • Après avoir rempli NSTextView avec mon texte

Y at-il une meilleure façon d'y parvenir?

Répondre

6

Après d'autres recherches, a trouvé la réponse:

  1. Créez des NSView sous-classe qui contient NSTextView
  2. Dans NSView sous-classe override layout méthode qui appelle invalidateIntrinsicContentSize

Consultez également ce lien qui explique subtilités de la mise en page automatique et de la taille intrinsèque du contenu (parmi beaucoup d'autres choses):

http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html

Exemple de code:

@interface MyView : NSView 
    @property MyTextView *textView; 
@end 

@implementation MyView 

// init & create content & set constraints 

-(void) layout { 
    [super layout]; 
    [self.textView invalidateIntrinsicContentSize]; 
} 

@end 

mise en œuvre de MyTextView:

@implementation MyTextView 

- (NSSize) intrinsicContentSize { 
    NSTextContainer* textContainer = [self textContainer]; 
    NSLayoutManager* layoutManager = [self layoutManager]; 
    [layoutManager ensureLayoutForTextContainer: textContainer]; 
    return [layoutManager usedRectForTextContainer: textContainer].size; 
} 

- (void) didChangeText { 
    [super didChangeText]; 
    [self invalidateIntrinsicContentSize]; 
} 

@end 
Questions connexes