2014-11-18 5 views
1

를, 애플이 10.6 이전에 수행 된 방법 대신 NSView의 주위에 초점 링을 그리는 기초하여 객체를 방법으로 drawFocusRingMaskfocusRingMaskBounds 방법을 사용하여 제안 (drawRect:NSSetFocusRingStyle()를 사용하여). (release notes 참조). : OSX 10.7로

은 OSX 10.10에서 테스트 :

- (void)drawFocusRingMask { 
    NSRectFill([self bounds]); 
} 
- (NSRect)focusRingMaskBounds { 
    return [self bounds]; 
} 

이 NSTextView는 프로그래밍 방식으로 콘텐츠보기에 직접 추가됩니다 (어떤 스크롤하지 않고 : 제안 나는 기본적인 초점 링을 구현하는를 NSTextView의 하위 그리기 한

보기).

이 방법은 대부분 잘 작동하지만 scaleUnitSquareToSize:을 사용하여 NSTextView의 크기를 조절할 때 그려지는 포커스 링은 완전히 올바르지 않습니다.

그래서 전화 :

[textView scaleUnitSquareToSize:NSMakeSize(1.5, 1.5)]; 

은 다음과 같습니다

enter image description here

위 또는 초점 링 RECT의 더욱 왜곡의 결과를 더 아래를 확장. NSTextView의 배율을 {1.0, 1.0}으로 재설정하면 포커스 링이 다시 올바르게 그려집니다.

나는 이것이 포커스 링 코드의 일종의 버그라고 가정합니다. drawFocusRingMask/focusRingMaskBounds (내부 클래스 _NSAutomaticFocusRing이 이에 대한 책임이 있음)을 호출하기 전에 초점 링을 그리는 데 사용 된 그래픽 컨텍스트의 변형을 수행하는 것으로 보입니다.

어떻게 해결할 수 있습니까? 컨텍스트를 적절한 좌표로 변환하는 방법을 찾아야합니까 (지금까지 성공하지 못했습니다)? 아니면 포커스 링이 올바르게 작동하도록하는 다른 방법이 있습니까?

+0

스케일링이 좌표계의 원점에서 수행된다는 사실과 관련이 있습니까? – FlyingPiMonster

+0

다른 그래픽 컨텍스트에서 _NSAutomaticFocusRing에 의해 별도로 그려지기 때문에 뷰의 크기 조정은 포커스 링에 직접 영향을 미치지 않습니다. _NSAutomaticFocusRing은 뷰를 쿼리하고 뷰의 좌표를 기반으로 변환을 수행하며 문제가 있다고 생각합니다. – danielv

답변

0

(NSTextField의 하위 클래스를 통해) drawFocusRingMask 메서드를 재정의하면 수퍼 뷰의 배율 인수를 "수동으로 적용"하여 포커스 링의 너비를 수정할 수 있지만 높이 변경은 작동하지 않습니다. 내 생각 엔 초점 링의 높이가 크기 조정 전에 텍스트 크기 또는 원본 텍스트 필드 범위에 고정되어 있습니다.

시스템의 모든 것 10.7.5. 따라서 텍스트 필드의 수퍼 뷰가 확대 된 상태 일 때 포커스 링을 끄기 만하면됩니다. 해결 방법을 알아낼 때까지 또는 할 일이 무엇이든간에.

0

저는 오랫동안이 버그로 고생했습니다. 문제가되는 해결책은 다음과 같습니다.

하위 클래스 NSTextField 또는 NSTextView 예 : ZoomableTextField입니다.

- (void)drawFocusRingMask 
{ 
} 

그런 다음 ZoomableTextField는 슈퍼 뷰의 drawRect: 방법 안에 내장되어있는 줌이 가능한 수퍼에서처럼 보이는 ZoomableTextField, drawPossibleFocus의 새로운 방법을, 전화 : 재정은 아무것도하지 않는다, 그래서 그 drawFocusRingMask: 메서드를 재정의 이 :

- (void)drawPossibleFocus 
{ 
    NSWindow *win = [self window]; 
    if ([self currentEditor]==[win firstResponder] && [win isKeyWindow]) { 
     [NSGraphicsContext saveGraphicsState]; 
     NSSetFocusRingStyle(NSFocusRingOnly); 
     NSRectFill([self frame]); 
     [NSGraphicsContext restoreGraphicsState]; 
     } 
}