2009-05-11 7 views
1

Je fais la mise en page manuelle pour mon application Cocoa et à un moment donné, j'ai besoin de comprendre quelle est la taille interne d'une sous-classe NSView. (Par exemple quelle est la hauteur disponible pour la vue de mon enfant à l'intérieur d'une NSBox?)Comment obtenir la taille interne/client d'une sous-classe NSView?

L'une des raisons est que j'utilise un système de coordonnées dont l'origine est en haut à gauche et que j'ai besoin d'effectuer des transformations de coordonnées.

Je n'arrivais pas à trouver un moyen d'obtenir cette taille jusqu'à présent et je serais heureux si quelqu'un pouvait me donner un indice.

Une autre propriété très intéressante que je voudrais savoir est la taille minimale d'une vue.

Répondre

5

-bounds est celui que vous cherchez dans la plupart des vues. NSBox est un cas particulier, car vous voulez regarder les limites de la vue de contenu de la boîte, pas les limites de la vue de boîte elle-même (la vue de boîte inclut le titre, les bords, etc.). De plus, le rectangle bound est toujours la taille réelle de la boîte, alors que le rectangle du cadre peut être modifié par rapport aux limites pour appliquer des transformations au contenu de la vue (comme écraser une image 200x200 dans une image 200x100).

Ainsi, pour la plupart des vues que vous utilisez juste [parentView bounds], et NSBox vous utiliserez [[theBox contentView] bounds], et vous allez utiliser [[theBox contentView] addSubview: myView] plutôt que [parentView addSubview: myView] pour ajouter votre contenu.

5

Malheureusement, il n'y a aucun moyen standard de faire cela pour toutes les sous-classes NSView. Dans votre exemple précis, la position et la taille d'une vue de l'enfant dans un NSBox peut être calculé comme suit:

NSRect availableRect = [someNSBox bounds]; 
NSSize boxMargins = [someBox contentViewMargins]; 
availableRect = NSInsetRect(availableRect, boxMargins.width, boxMargins.height); 

Si vous vous trouvez en utilisant ce souvent, vous pouvez créer une catégorie sur NSBox comme suit:

// MyNSBoxCategories.h 
@interface NSBox (MyCategories) 
- (NSRect)contentFrame; 
@end 


// MyNSBoxCategories.m 
@implementation NSBox (MyCategories) 
- (NSRect)contentFrame 
{ 
    NSRect frameRect = [self bounds]; 
    NSSize margins = [self contentViewMargins]; 
    return NSInsetRect(frameRect, margins.width, margins.height); 
} 
@end 

Et vous l'utiliser comme ceci:

#import "MyNSBoxCategories.h" 

//... 

NSRect frameRect = [someNSBox contentFrame]; 
[myContentView setFrame:frameRect]; 
[someNSBox addSubview:myContentView]; 
+0

Merci pour votre réponse. J'aurais dû utiliser un autre exemple car NSBox est en effet un peu spécial en ce qu'il a ces méthodes supplémentaires qui manquent beaucoup d'autres classes :( –

+0

Aucun problème. [Bounds someView] était la réponse que vous cherchiez après tout? :) –

Questions connexes