2013-06-17 10 views
1

Y at-il un moyen de redimensionner automatiquement la hauteur d'un NSTokenField (en gardant la largeur constante) en utilisant des contraintes?Redimensionnement automatique NSTokenField avec mise en page basée sur les contraintes

-sizeToFit devrait fonctionner, mais ce n'est pas le cas. Si je mets une contrainte pour garder la largeur constante et appelle cette méthode, elle ignore les contraintes et ne redimensionne que la largeur (quand je veux redimensionner seulement la hauteur).

Répondre

0

Basé sur How to let NSTextField grow with the text in auto layout?

également de taille ne contraintes définies pas, il suffit que ce soit.

La méthode intrinsicContentSize de NSView renvoie ce que la vue elle-même considère comme sa taille de contenu intrinsèque.

NSTextField calcule ceci sans tenir compte de la propriété wraps de sa cellule, donc il rapportera les dimensions du texte s'il est présenté sur une seule ligne.

Par conséquent, une sous-classe personnalisée de NSTokenField peut remplacer cette méthode pour retourner une meilleure valeur, tel que celui fourni par cellSizeForBounds: procédé de la cellule:

-(NSSize)intrinsicContentSize 
{ 
    if (![self.cell wraps]) { 
     return [super intrinsicContentSize]; 
    } 

    NSRect frame = [self frame]; 

    CGFloat width = frame.size.width; 

    // Make the frame very high, while keeping the width 
    frame.size.height = CGFLOAT_MAX; 

    // Calculate new height within the frame 
    // with practically infinite height. 
    CGFloat height = [self.cell cellSizeForBounds: frame].height; 

    return NSMakeSize(width, height); 
} 
+0

pas tout à fait, le cellSizeForBounds retourne toujours la même taille dans tokenfield ... aussi vous devez écouter sur textDidChange et invalidateIntrinsicContentSi ze –

+0

@PeterLapisu cellSizeForBounds ne retourne pas toujours la même taille, au moins sur 10.11. J'ai posté une réponse avec le code complet. – rdougan

1

La méthode cellSizeForBounds du champ jeton ne retourne le bon la taille, de sorte que vous pouvez l'appliquer comme celui-ci (sous-classe personnalisée, à Swift):

class TagsTokenField: NSTokenField { 

    override func textDidChange(notification: NSNotification) { 
     super.textDidChange(notification) 
     self.invalidateIntrinsicContentSize() 
    } 

    override var intrinsicContentSize: NSSize { 
     let size = self.cell!.cellSizeForBounds(NSMakeRect(0, 0, self.bounds.size.width, 1000)) 
     return NSMakeSize(CGFloat(FLT_MAX), size.height) 
    } 

} 
Questions connexes