2009-07-14 14 views
3

Ich möchte gelegentlich die Dimensionen eines NSView programmatisch ändern. Um dies zu tun, ist es hilfreich, die Dimensionen verschiedener Ansichten zu erhalten, sie relativ zueinander anzupassen und dann setFrame: zu repositionieren.Warum gibt eine Frame-Methode eines NSView falsche Ergebnisse zurück?

Das Problem ist, dass die Rahmenmethode normalerweise NSRects zurückgibt, die aus meiner Sicht eindeutig falsch sind.

Ich habe ein Programm mit einem NSPanel in Interface Builder eingerichtet und verschiedene Verbindungen zu meinem Hauptprogramm. Um die NSRects, die von frame zurückgegeben wurden, zu testen, öffnete ich das Panel in der wakeFromNib: -Methode meiner Anwendung, holte einige NSRects heraus und druckte sie auf der Konsole aus.

Hier ist meine awakeFromNib:

- (void)awakeFromNib { 
    NSLog(@"in awakeFromNib"); 
    [self showPrefsSheet:self]; //this is the prefs sheet with the controls of interest 
           //note that it does indeed pop up and is displayed 
    originalFrame = [aTextView frame]; 
    NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height); 
    originalFrame = [aButton frame]; 
    NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height); 
    return; 
    } 

Die Ergebnisse dieser Code wie folgt aussehen in der Konsole:

in awakeFromNib 
the frame is 0, 0, 0, 0 
the frame is 0, 1079230464, 0, 1078329344 

Beachten Sie, dass (i) die Platte und beide Steuerelemente auf dem Bildschirm angezeigt werden ; (ii) Ich weiß aus der Tatsache, dass die Steckdosen richtig verbunden sind, weil ich programmgesteuert Dinge mit den Kontrollen machen kann und sie funktionieren lassen kann; (iii) Der Interface Builder zeigt im Inspector unter "Size & Position" die korrekten Framegrößen an.

Kurz gesagt, alles andere über das Programm funktioniert perfekt. Es scheint tatsächlich, dass die Rahmenmaße nicht richtig oder so eingestellt sind.

Kann mir jemand sagen, wie man die echten Rahmeninformationen abruft? Oder zumindest die Ergebnisse erklären, die ich sehe?

Antwort

9

Die Rahmenkoordinaten sind Floats, aber Ihre Protokollmeldungen verwenden% d. (Ints).

Änderung der NSLog Zeichenfolge:

@"the frame is %f, %f, %f, %f" 

Edited:

Hier ist ein sehr nützliches Makro ich benutze, wenn Rects Debuggen:

#define RECTLOG(rect) (NSLog(@"" #rect @" x:%f y:%f w:%f h:%f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)); 

Anschließend können Sie tun einfach rect Protokolle:

RECTLOG([aTextView frame]); 
+0

Junge, ist mein Gesicht rot! Danke, Kailoa. Ich bin dumm, aber ich bin froh, dass ich das hinter mich bringen kann. – Dennis

+0

kein Problem. Ich werde ein Makro hinzufügen, das auch sehr nützlich ist. – amattn

4

Beachten Sie beim Protokollieren eines NSRect, dass die Felder Gleitkommazahlen sind, keine Ganzzahlen.

Anstatt das Format zu schreiben Planern selbst (entweder inline oder über ein Makro), verwenden Sie die Funktionen, die den Rahmen für Sie sieht vor:

NSLog(@"frame - %@", NSStringFromRect([view frame])); 

Siehe auch:

NSStringFromSize 
NSStringFromPoint 
NSStringFromRange 

etc

+0

Ich stimme zu. Die Methoden 'NSStringFrom *' sind am besten für 'NSLog'ging geeignet. Sie geben Ihnen einige schön formatierte Ergebnisse. – Alex

+0

Ja, das einzige Problem ist, dass NSStringFromRect eine Warnung bei iPhone-Projekten generiert. Auf dem iPhone müssen Sie NSStringFromCGRect verwenden. Mit einem Makro-Wrapper können Sie auch den Variablennamen einbetten. Jeden Weg funktioniert aber. – amattn

+0

Verwenden Sie daher den Typ NSStringFromCGRect, wenn Sie ein CGRect haben. Es ist nicht so, dass Sie den Typ der Variablen nicht kennen, wenn Sie den Code schreiben. Beachten Sie auch, ob NS_BUILD_32_LIKE_64 für das, was Sie erstellen, anwendbar ist, und verwenden Sie es gegebenenfalls. –