2009-04-19 4 views
0

recessed-style NSButtonCell 개체를 사용하는 사용자 지정 범위 막대를 만드는 방법을 실험하고 있습니다. 그러나 마우스가 움직일 때 베젤을 그리는 데 문제가 있습니다. 추적 영역을 만들고 마우스가 안에있는 동안 showsBorderOnlyWhileMouseInside를 NO로 설정하고 YES가 외부로 이동할 때 YES로 설정할 수 있습니다. 그러나 NSButtonCell이 자체 추적을 수행 할 것이므로 특히 해킹처럼 느껴질 수 있습니다.사용자 지정 컨트롤에 여러 개의 recessed NSButtonCells

컨트롤의 setCell 메서드를 사용하는 경우 버튼 셀이 컨트롤의 addTrackingRect : owner : userData : assumeInside :를 호출하고 마우스를 올려 놓을 때 베젤을 그리기 위해 자체 추적을 설정합니다. 그러나 동일한 컨트롤에서 여러 단추 셀을 사용하려면 단추 셀의 setControlView 메서드를 사용하여 각 셀의 controlView를 사용자 지정 컨트롤로 설정하려고 시도하지만 셀에 setCell과 같은 추적 영역을 설정하라는 메시지는 표시하지 않습니다.

기술은 NSMatrix가이를 수행하기 때문에 가능하지만 모든 API와 포럼을 읽은 후에 컨트롤의 setCell 메소드를 사용하지 않고 NSButtonCell의 추적 동작을 시작하는 방법을 찾지 못했습니다. 이마가 책상을 때리면서 피를 흘 렸습니다. 도움을 주시면 감사하겠습니다.

답변

1

나중에 다시 돌아와서 NSView가 아닌 ​​NSControl으로 사용자 정의 하위 클래스를 변경하면 addTrackingRect 메서드가 셀에 의해 자동으로 처리된다는 것을 발견했습니다. 필요에 따라서, 셀의 마우스 모드를 구현하기 위해서, 셀의 mouseEntered/mouseExited 메소드를 호출하면됩니다. 희망이 사람을 도움이됩니다.

0

먼저, 반창고가 도움이 될 수 있습니다. ;)

NSButtonCell의 -updateTrackingAreaWithFrame : inView : 메소드를 사용해 보셨습니까? 문서화되지 않았지만 class-dump가 Leopard에서 생성하는 NSButtonCell 헤더에 나타납니다. 밑줄로 시작하지 않는 문서화되지 않은 방법의 사용에 관한 공식적인 단어 또는 일반적인 합의가 확실하지 않으므로주의해야합니다.

다른주의 사항 : 여러 개의 buttonCell을 사용하는 대신이 작업에 대한보기에서 여러 개의 단추를 사용하는 것이 좋습니다. NSMatrix와 같은 기존 클래스를 기반으로 자신 만의 클래스를 모델링하는 것은 훌륭한 일이지만 찾고있는 것과 같은 복잡한 동작의 경우에는 약간 벗어나는 것이 더 효과적입니다. 셀 집합과 함께 단일 뷰를 사용하는 대신 많은 뷰를 사용하는 개념은 비싸지 만에는 여전히 장점이 있지만, 해당 경로를 사용하려면 해킹 구현이 필요하면 다른 방법을 사용하십시오.

+0

감사합니다. Dirk - 전적으로 동의합니다. NSCell에 대한 설명서가 칭찬을 받으면 버튼 사용에 대해 유죄라고 생각합니다. 나는 잠시 동안 쥐 구멍을 쫓을 것이라고 생각했지만, 이것을 구현하기위한 만족스러운 해결책이없는 것 같습니다. updateTrackingAreaWithFrame : inView : 메서드를 시도했지만 트릭을 수행하지 않았습니다. Cocoa가 NSButton을 사용하여 스택을 처리 할 때 스택을 살펴보면 일련의 비공개 API가 전달되는 것을 보여주기 때문에 우리가 직접 처리하는 것처럼 보이지는 않습니다. –

관련 문제