위의 응용 프로그램에서 질감이있는 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 릴리스 가능).
이 게시물이 유용하기를 바라며,이 버그는 진정으로 혼란스럽고, 해결하기를 기대했던 것보다 훨씬 오래 걸렸습니다. 이러한 문제에 관한 문서가 너무 적어서 다른 사람들의 시간을 절약하고 온라인 검색을 통해 더 많은 노출과 키워드를 발견 할 수 있기를 희망하면서 내 연구 결과를 게시 할 가치가 있다고 생각했습니다.
감사합니다. 코코아 히로에 대한 답변이 없으면 나와 많은 사람들이 여전히이 문제를 해결하기 위해 애 쓰고 있습니다.
방금 문제가 해결되었습니다. 콘텐츠 경계를 사용자 정의로 설정해야만 그래디언트 크기를 사용자 정의 할 수 있습니다. 사랑해 ! – Dimillian
나를 사랑한다면 투표를하고 대답을 선택하십시오! = D 오, 나는 너를 너무 사랑해. – cocoahero
그래서 결국 if가 appkit 버그 일 수 있지만 쉽게 해결할 수 있습니다. 정말이 NSTextField 때문에 커스텀 윈도우를 그려 줘서 고마워. http://raven.io 새로운 UI를 저장하면됩니다. – Dimillian