2017-11-08 4 views
3

Q&A 1785에 따르면, -drawFocusRingMask 및 -focusRingMaskBounds 메서드를 재정의하는 간단한 문제 여야하는 컨트롤 주위에 적절하고 현대적인 애니메이션 포커스 링을 그립니다.서브 클래 싱없이 코코아 포커스 링을 그리는 방법?

이 프로젝트에서는 코코아 메서드를 선언하고 호출 할 수 있지만 실제로 내 자신의 뷰 하위 클래스를 만들 수있는 기회는 전혀주지 못합니다.

실제 하위 클래스를 만들지 않고도 적절한 포커스 링을 얻을 수있는 방법이 있습니까? 이 10.7 기술 노트 이후에 소개 된 몇 가지 다른 방법으로 작업을 완료 할 수 있습니까? 또는 런타임에 기존 클래스에 메소드를 삽입하는 비열한 방법이 있습니까?

+0

Xojo는 ['class_addMethod()'] (https://developer.apple.com/documentation/objectivec/1418901-class_addmethod?language=objc) (← 클릭 가능)과 같은 libobjc 함수를 사용할 수 있습니까? – hidefromkgb

+0

당신이 추가 한 커스텀 코코아 컨트롤을위한 것입니까? MBS 플러그인을 통해이 작업을 수행하면 계획중인 작업을 수행하지 않고도 NSControl의 focusRing 속성을 전환 할 수 있다고 생각합니다. 나는 내 애플 리케이션에서 이것을 몇 번 해왔다. –

+0

TextArea 컨트롤 주위에 포커스 링이 있습니다. MBS 플러그인의 필요성을 피하기를 원합니다. –

답변

2

옵션 프로토콜 방법을 추가하려는 경우 한 가지 의견으로 class_addMethod()이 적합 할 것입니다. public macoslib 프로젝트에는이를 수행하는 방법을 보여주는 몇 가지 코드가 있으며 그 이름을 검색하면됩니다.

그러나 기능이 이미 구현 된 경우 다른 기능을 추가 할 수 없습니다. 이 경우 메서드 swizzling 솔루션입니다. selector 'd 함수 주소를 다른 주소로 바꾸고 원래 주소를 호출하는 일반적인 방법입니다.

Xojo에 예제가없는 것 같습니다.

업데이트 표준 코코아

가장 간단한 해결책을 제어한다 (macoslib에서 가능) NSViewfocusRingType 따라서 속성을 설정하는 것이다. drawFocusRingMask을 구현하는 것은 사용자 지정 컨트롤에만 필요합니다.

+0

이것은 유망한 것으로 들리지만, 지금까지는 제대로 작동하지 않습니다. TextArea 클래스 (부수적으로 XOJScrollView라고 함)에서 class_addMethod를 호출하고 Q & A에 표시된대로 drawFocusRingMask와 focusRingMaskBounds를 모두 추가 할 수 있었지만 여전히 포커스 링을 얻지 못했습니다. –

+0

또한 뷰 계층 구조 (XOJScrollView에는 XOJTextView를 포함하는 NSClipView가 포함되어 있고 XOJScrollView에는 NSScroller도 포함되어 있음)에 더 깊이 도달하려고 시도하고 이러한 메서드를 XOJTextView에 추가했습니다. 다시 추가가 성공했지만 여전히 초점 링이 나타나지 않습니다. –

+0

이 경우 focusRingType 설정이 충분하다는 것을 확인했습니다. 이 경우에는 작동하지 않을 것이라는 잘못된 믿음으로 노력하고있었습니다. –

관련 문제