2012-08-15 5 views
4

텍스트 필드와 베젤 버튼이있는 창이 있습니다. 경계가 없으며 투명하지만 문제는 모든 창에서 재현됩니다.코코아 창문의 둥근 모서리 그라디언트 배경

해당 창의 내용보기는 IB에서 창 배경을 그리는 사용자 지정 클래스로 설정됩니다.

enter image description here enter image description here

을 무슨 일이야 :

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [NSGraphicsContext saveGraphicsState]; 

    float cornerRadius = 10; 
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:self.bounds xRadius:cornerRadius yRadius:cornerRadius]; 

    [path setClip]; 

    NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations: 
          [NSColor colorWithCalibratedRed:0.96f green:0.96f blue:0.96f alpha:1.00f], 0.0f, 
          [NSColor colorWithCalibratedRed:0.84f green:0.84f blue:0.84f alpha:1.00f], 1.0f, 
          nil]; 

    [gradient drawInRect:self.bounds angle:270]; 

    [NSGraphicsContext restoreGraphicsState]; 
} 

그것은 사라지고 개체 또는 창의로 변경 텍스트 필드의 배경처럼, 정말 이상한 유물 원인 : 여기

코드인가? 나는 그것을 고립 시키려고 노력했다. 나는이 "그래픽 컨텍스트 상태를 저장하는 것"(나는 정확하게 이해할 지 모르겠다)으로 놀아 왔지만, 문제는 계속된다.

XCode 4.4, SDK가 10.7 (내 OS이기도 함)이며 배포 대상은 10.6입니다. 그것은 아마 문제가되지 않습니다,하지만 나는 과거에 비슷한 것을 해왔고 그런 이상한 문제가 없었습니다.

+0

사람이 까다로운 문제처럼 보입니다. – loyalflow

+0

예. 예, 그렇습니다. – radex

답변

0

해결 방법 하나의 해결 방법은 self.bounds와 같은 크기로 (window의 -awakeFromNib 또는 -init) NSImage를 만든 다음 이미지에이 그라디언트를 그립니다 (이미지의 -lockFocus, -unlockFocus 사용). 그런 다음 window.backgroundColor = [NSColor colorWithPatternImage : image]를 사용하여 이미지를 배경으로 설정할 수 있습니다.

작동하지만 해결책이 만족스럽지 않습니다.

위의 이유가 표시되지 않는 이유가 표시되지 않습니다. 그리고 뷰를 그리는 것과 비슷한 이상한 문제를 겪었으므로 그것이 작동하지 않는 실제 이유를 알고 싶습니다.

6

문제는 [경로 setClip] 방법 인 것 같습니다. 나는 이것을 주석 처리했으며 텍스트 필드와 버튼은 적절히 그렸다.

[gradient drawInBezierPath:path angle:270]; 

[gradient drawInRect:self.bounds angle:270]; 

모든 것이 완벽하게 작동 :

그래서, 해, 행을 교체했다. 단추 및 텍스트 필드가 예상대로 나타납니다.

NSBezierPath의 Class 참조 상태 :는 바깥 쪽보기가 설정 한 범위를 넘는 클리핑 패스를 확장 할 수 있으므로

당신은, 클리핑 패스를 조정하는 방법으로이 방법을 사용하지 않아야합니다. 이 방법을 사용하는 경우 클리핑 경로를 수정하기 전에 그래픽 상태를 저장하고 작업이 완료되면 그래픽 상태를 복원하십시오.

이 방법은 현재 와인딩 규칙을 사용하여 수신기의 클리핑 모양을 결정합니다. 이 f}은 수신자 경로에 영향을주지 않습니다.

내가 본 문제를 실제로 설명하지는 않지만 그 밖에 그라디언트를 그릴 수있는 방법을 찾아야합니다.

+0

답변 해 주셔서 감사합니다. 내일 볼 것입니다! – radex

+0

이봐, 작동하는 것 같아! :) 그러나 내 "둥근 모서리"베즐 경로를 더러운 사각형으로 자르려면 어떻게해야합니까? 무엇을 사용합니까? + clipRect : 중 NSBezierPath? 그것은 작동하는 것처럼 보이지만 가장자리 경우에 대해서는 모르겠다 ... – radex

+0

view에 대한 drawRect를 보면, 전체보기에 대해 dirtyRect가 전달 된 다음 텍스트 필드에 대해 dirtyRect가 전달된다. 커서가 깜박입니다. 이것이 클리핑이 텍스트 필드와 버튼에 영향을 미치는 이유라고 생각합니다. 문제는 dirtyRect에 "둥근 모서리"를 적용 할 때입니다. dortyRect는 다른 시간에 뷰의 다른 부분을 나타 내기 때문에 dirtyRect를 사용하면 해당 부분에 영향을 미칩니다. –

0

나는 이것이 이상하거나 짜증 난다고 동의합니다.하나는 레이어가 서로 간섭을 일으킬 수있는 문제 일 뿐이라고 생각할 것입니다. 그러나 다음 작업을 수행하지 않으면 해결하기가 어려워 보입니다.

여기에 설명하는대로 이 엉망입니다. 및 후 -

enter image description here

enter image description here

.. 인터페이스 빌더를 통해 변경할 간단한 체크 박스와 내가 발견 한 그 상자 또는보기 또는 기타 등등의 문제가 컨트롤을 둘러싸 다음을 클릭하여 인터페이스 빌더의 "코어 애니메이션" "setWantsLayer"버튼을 누르면 모든 kurfuffle없이 인터페이스 요소가 빛나게됩니다.

enter image description here

바보 같은 해결 방법의 종류 ...하지만 실제로는 작동 - 쉽습니다.

PS - 나는 그것이 이런 종류의 문제를 해결할 때 (등 색) 매개 변수 조금 더 극적인을하는 데 도움이 발견 - 당신은 무엇이 잘못되었는지 사람들에게 설명하기 위해 노력하고 특히 ..

+0

안녕하세요, 팁 주셔서 감사합니다. 그것은 유용하게 보이지만, 특정 프로젝트에서 CA 레이어를 사용하는 이러한 문제는 옵션이 아니 었습니다. (앱이 WebKit을 기반으로했기 때문에 어떤 이유로 레이어가 나타날 때 엉망이되었습니다.) – radex

+0

흥미 롭습니다! "NSGraphicsContext currentContext"가 nil 일 때 이미지를 그리는 것은 의미가 없지만 프로그래밍 오류입니다. 디버깅을 위해 void _NSWarnForDrawingImageWithNoCurrentContext()를 중단하십시오. 이것은 한 번만 기록됩니다. 이것은 미래에 깨질 수 있습니다. " 무슨 뜻이에요? – radex

+0

"QuartzCore.framework"에 "링크"하셨습니까? 그것은 ** ** [NSGraphicsContext saveGraphicsState]; 및'[NSGraphicsContext restoreGraphicsState];없이 ** 나를 위해 작동합니다. 그냥 거기서 나갑시다! 일반적으로 코코아와 쿼츠 드로잉을 혼합하거나 드로잉 루틴 내 특정 "하위 rect"에 포커스를 둘 때 컨텍스트에 대해 걱정할 필요가 있습니다. –