2011-10-17 6 views
3

나는 이상한 문제가 있습니다. Textured 창에 일반 그래디언트 색상을 지정합니다. 이 창에 NSTextField가 있습니다. 텍스트 필드는 URL 입력 필드로 지정되어 있으므로 커야합니다. 문제는 너무 커서 (약 1/3의 창 너비보다 큼) 텍스처가있는 창을 전환하여 더 어두운 버전의 그라디언트를 그려야한다는 것입니다.NStextField가있는 NSWindow 질감 배경

다음은 테스트 할 수있는 프로젝트의 예입니다 (매우 간단합니다 ...).

http://raven.ipodtutofast.com/test.zip

빌드하고 윈도우의 배경을 알 실행

, 초기 하나는 괜찮습니다, 이제 윈도우가 더 큰, 그것은 어두운 배경으로 전환됩니다합니다.

저는이 문제를 해결하는 방법에 대해 전혀 모릅니다.

업데이트 : 코코아 히로 덕분에 IB의 콘텐츠 테두리 설정에서 사용자가 원하는대로 그라디언트 높이를 설정할 수 있습니다. 이전에는 알 수 없었습니다.

답변

12

"콘텐츠 테두리"설정과 관련이있는 것으로 보입니다. IB에서 none으로 설정하면 문제가 발생하지 않고 그래디언트도 수정됩니다. 나 한테 버그 같아. 아마도 레이더를위한 시간일까요?

+0

방금 ​​문제가 해결되었습니다. 콘텐츠 경계를 사용자 정의로 설정해야만 그래디언트 크기를 사용자 정의 할 수 있습니다. 사랑해 ! – Dimillian

+4

나를 사랑한다면 투표를하고 대답을 선택하십시오! = D 오, 나는 너를 너무 사랑해. – cocoahero

+0

그래서 결국 if가 appkit 버그 일 수 있지만 쉽게 해결할 수 있습니다. 정말이 NSTextField 때문에 커스텀 윈도우를 그려 줘서 고마워. http://raven.io 새로운 UI를 저장하면됩니다. – Dimillian

4

위의 응용 프로그램에서 질감이있는 NSWindows에 그라디언트 문제가 발생했지만이 문제를 해결하는 데 도움이되는이 게시물을 찾는 데 오랜 시간이 걸렸습니다.

나는이 게시물에 조금 더 추가하여 다른 개발자가 해결책이 미래에 더 쉽게 나타날 수있는 동일한 문제를 겪고 있음을 확인했습니다.

필자는 필자가 텍스쳐 윈도우 세트로 응용 프로그램을 만들었습니다. Dimillian77의 문제와 마찬가지로, 내 응용 프로그램의 메인 윈도우 배경 텍스쳐는 서브 뷰의 크기 조정과 배치에 영향을받습니다. 제 경우에는 NSWindowController가 메인 윈도우의 NSWindowController가 전환하는 다양한 NSView 서브 뷰였습니다. 사용자가 액세스하는 응용 프로그램 NSView 하위보기의 크기와 배치가 각 하위보기마다 약간 씩 다르므로 기본보기의 배경 그라디언트가 하위보기 뒤에서 점프하기 때문에 사용자가 각보기를 전환 할 때 그라데이션 버그가 더 분명해졌습니다.

흥미롭게도 OS X 10.7 Snow Leopard로 전환 한 후에 만 ​​그래디언트 문제가 나타났습니다. 동일한 수정되지 않은 소스 코드와 .xib/.nib 파일은 이전 버전의 OS X에서이 문제가 발생하지 않았습니다. 이 문제가 레이다 보고서의 가치가있는 새로운 버그 일 수 있다는 코코아 히로의 제안에 동의하는 것 같습니다. 아마도 Mountain Lion에서 수정 된 것일 것입니다.

내 응용 프로그램의 주요 NSWindow와 여러 개의 지원 창이 모두 "Textured"(메탈릭) 배경 옵션을 사용하도록 설정되었지만 Snow Leopard로 이동 한 후에 만 ​​그래디언트 '버그'가 나타납니다.

이 게시물을 찾기 전에 문제를 '해결'하기 위해 우연히 발견 한 유일한 방법은 창에 "크기 조정"컨트롤을 사용하여 그라디언트 버그가 사라 졌다는 것을 알아 채는 것입니다.

그러나 특정 응용 프로그램 창의 크기를 조정할 필요가 없으며 "Resize"제목 표시 줄을 -(void)setShowsResizeIndicator:(BOOL)showResizeIndicator으로 비활성화하고 사용자가 -(NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize에 대한 호출을 가로 채어 창의 크기를 조정하려고 시도하는 횟수를 무시할 수 있습니다. , 이것은 분명히 우아한 해결책이 아니 었습니다.이 솔루션은 특히 윈도우가 코드에서 윈도우의 크기를 조정하려는 시도를 무시할 때 사용자에게 혼란을주기 때문에 마우스 커서의 크기 조정 커서 (아직 숨길 수 없었던)를 여전히 보여 주었기 때문에 실패했습니다.

고맙게도 "Content Border"설정을 "None"으로 변경 한 코코아 히로의 솔루션은 Interface Builder (Xcode 4.3.3과 통합 된 버전)에서 그라디언트 문제를 즉시 사라지게했지만 적어도 내 경우에는 처음에는 이 변경 후에 응용 프로그램을 컴파일하고 실행하면 .xib 파일이로드 되 자마자 응용 프로그램이 손상됩니다. 다음 오류 메시지가 추적에 나타납니다. "setAutorecalculatesContentBorderThickness : forEdge : 텍스처가 아닌 창에서 NSMaxYEdge를 사용하여 호출 할 수 없습니다".

"사용자 지정"으로 응용 프로그램을 저장하고 컴파일 한 후에 "콘텐츠 테두리"설정을 "사용자 지정"으로 설정하고 "위쪽"과 "아래쪽"콘텐츠 테두리를 "1"로 설정하면 충돌이 해결되었습니다. "설정을 통해 실험을 통해"사용자 지정 테두리 "설정을"없음 "으로 변경하고 응용 프로그램을 컴파일하고 두 번째 컴파일에서 정상적으로 실행되도록 할 수있었습니다.

그러나 "내용 테두리"를 "자동 크기 조정"이외의 값으로 변경하면 XCode에서 수십 개의 "잘못된 구성 : Mac OS X 10.7 이전 자동 레이아웃"오류가 발생하고 여러 가지 "특성 없음 : 10.6 "오류 이전의 Mac OS X 버전에서 Top/Bottom Content Border 속성에 대한 Autosize 이외의 값 - 모두"Content Border "속성과 관련됩니다 (내 배포 대상이 10.7이 아닌 OS X 10.6으로 설정 됨). 따라서 오류에 대한 다른 솔루션 검색이 다시 시작되어 아래에 나와있는 솔루션으로 안내됩니다. 필자가 발견 한 솔루션은 적어도 OS X 10.7에서 Interface Builder의 "Autosize"로 각 텍스쳐 윈도우의 "Content Border"를 설정하고 코드의 내용 테두리 설정을 덮어 쓰는 것입니다 (필자의 경우이 코드를 배치하여 내 질감 윈도우의 NSWindowController 클래스의 각)로 :

// windowDidLoad is called when the window has loaded but before it's displayed... 
-(void)windowDidLoad 
{ 
    // set the content border thickness to 0 for both the top and bottom window edges 
    [[super window] setContentBorderThickness:0 forEdge:NSMaxYEdge]; // top border 
    [[super window] setContentBorderThickness:0 forEdge:NSMinYEdge]; // bottom border 

    // disable the auto-recalculation of the window's content border 
    [[super window] setAutorecalculatesContentBorderThickness:NO forEdge:NSMaxYEdge]; 
    [[super window] setAutorecalculatesContentBorderThickness:NO forEdge:NSMinYEdge]; 
} 

당신이 코드를 통해 또는 다른 NSWindow 표시에 인터페이스 빌더를 통해 중 하나를 설정하려고 경우에만, 질감 창에 상위 콘텐츠 테두리 두께를 설정할 수 있습니다 유형을 지정하면 시스템에서 예외가 발생하여 응용 프로그램이 중단 될 수 있습니다.

NSWindow 문서에 따르면 "setContentBorderThickness : forEdge : forEdge를 호출하는 질감이 아닌 창에서 NSMaxYEdge를 전달하면 예외가 발생하며 텍스처 창이있는 위쪽 가장자리의 내용 테두리 두께를 설정하는 경우에만 유효합니다."

그래디언트 문제는 실제로 OS X 10.7의 "Textured"렌더링에 새로운 버그가있는 것처럼 보이므로 내용 테두리를 덮어 쓰는 코드를 수정하여 해당 코드 만 실행되도록하는 것이 좋습니다 OS X 10.7을 실행하는 시스템 (그리고 Mountain Lion에서 문제가 해결되지 않은 경우 향후 OS X 릴리스 가능).

이 게시물이 유용하기를 바라며,이 버그는 진정으로 혼란스럽고, 해결하기를 기대했던 것보다 훨씬 오래 걸렸습니다. 이러한 문제에 관한 문서가 너무 적어서 다른 사람들의 시간을 절약하고 온라인 검색을 통해 더 많은 노출과 키워드를 발견 할 수 있기를 희망하면서 내 연구 결과를 게시 할 가치가 있다고 생각했습니다.

감사합니다. 코코아 히로에 대한 답변이 없으면 나와 많은 사람들이 여전히이 문제를 해결하기 위해 애 쓰고 있습니다.

+0

Mountain Lion GM에서이 버그가 수정 된 경우 새로운 세부 답변을 보려면 정말 열정적입니다. 내가 그걸 싸워야 만했던 때를 기억해. – Dimillian

+0

@ Dimillian77 - 아니, 여전히 Mountain Lion에 있습니다. 사실 텍스쳐 그라디언트의 색상 변경 때문에 내 애플리케이션에서 더 눈에 띄게되었습니다. 다행히도, 여기에 대한 답은 나를 위해이 문제를 마침내 해결했습니다. –