2009-07-14 4 views
3

가끔 NSView의 치수를 프로그래밍 방식으로 변경하고 싶습니다. 이렇게하려면 다양한 뷰의 크기를 가져 와서 서로 상대적으로 조정 한 다음 setFrame :을 사용하여 위치를 변경하는 것이 좋습니다.왜 NSView의 프레임 메소드가 잘못된 결과를 반환합니까?

프레임 방식은 일반적으로 내 관점에서 명백하게 잘못된 NSRects를 반환합니다.

인터페이스 빌더에 NSPanel이 설정되어 있고 내 프로그램에 다양한 연결이있는 프로그램이 있습니다. 프레임에 의해 반환 된 NSRects를 테스트하기 위해 응용 프로그램의 awakeFromNib : 메서드에서 패널을 열고 NSRects를 검색하여 콘솔에 출력했습니다. (ⅰ) 패널 모두 컨트롤이 화면에 표시됩니다

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

하는 것으로이 코드의

- (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; 
    } 

결과는 콘솔에서 다음과 같이 : 여기

내로 awakeFromNib입니다 ; (ii) 콘센트가 제대로 연결되어 있다는 사실을 알고 있습니다. 프로그래밍 방식으로 컨트롤에 작업을 수행 할 수 있기 때문입니다. (iii) 인터페이스 작성기는 "크기 & 위치"아래의 속성에서 정확한 프레임 크기를 보여줍니다. 요약하면 프로그램에 대한 모든 것이 완벽하게 작동합니다. 실제로 프레임 치수가 제대로 설정되지 않은 것 같습니다.

누군가 실제 프레임 정보를 검색하는 방법을 말해 줄 수 있습니까? 또는 적어도 내가 본 결과를 설명하십시오.

답변

9

프레임 좌표는 실수이지만 로그 메시지는 % d을 (를) 사용하고 있습니다. (ints).

변경 NSLog 문자열 :

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

편집 :

#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)); 

그런 다음 쉽게 RECT 로그를 수행 할 수 있습니다 :

다음의 구형을 디버깅 할 때 내가 사용하는 매우 유용한 매크로입니다

RECTLOG([aTextView frame]); 
+0

소년, 내 얼굴이 붉어! 감사합니다. Kailoa. 나는 바보 같지만 이걸 내 뒤에 넣을 수있어서 기쁩니다. – Dennis

+0

문제 없습니다. 나는 슈퍼 유용한 매크로를 추가 할 것이다. – amattn

4

NSRect를 로깅 할 때 필드가 정수가 아닌 부동 소수점 값이라는 것을 기억하십시오. 또한

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

참조 :

오히려 형식을 쓰는 것은 자신 (인라인 또는 매크로를 통해 하나를) 지정자보다, 프레임 워크가 당신을 위해 제공하는 기능을 사용

NSStringFromSize 
NSStringFromPoint 
NSStringFromRange 

+0

동의합니다. 'NSStringFrom *'메소드는'NSLog'를 위해 사용하는 것이 가장 좋습니다. 그들은 당신에게 멋지게 포맷 된 결과를줍니다. – Alex

+0

예, 유일한 문제는 NSStringFromRect가 iPhone 프로젝트에서 경고를 생성한다는 것입니다. iPhone에서는 NSStringFromCGRect를 사용해야합니다. 또한 매크로 래퍼를 사용하면 변수 이름을 포함시킬 수 있습니다. 어느 쪽이든 작동합니다. – amattn

+0

CGRect가 있으면 적절한 NSStringFromCGRect 형식을 사용하십시오. 마치 코드를 작성할 때 변수의 유형을 모르는 것만 큼 다르지 않습니다. NS_BUILD_32_LIKE_64가 건물에 적용되는지 여부를 고려하고 적절할 경우 NS_BUILD_32_LIKE_64를 사용하십시오. –

관련 문제