2011-03-27 4 views
4

HUD 패널에있는 NSOutlineView로 작업하고 있습니다. 배경을 그리지 않도록 구성했습니다. 두 번 클릭하여 셀을 편집 할 때까지 모든 것이 잘 보입니다. 필드 편집기는 전체 사용자 경험을 완전히 파괴하는 배경 및 포커스 링을 그립니다.NSOutlineView with transparent field editor

이것은 내가 NSTextFieldCell의 하위 클래스에서 뭘하는지입니다 :

- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj 
{ 
    NSText *text = [super setUpFieldEditorAttributes:textObj]; 

    [text setDrawsBackground:YES]; 
    [text setBackgroundColor:[NSColor darkGrayColor]]; 

    return text; 
} 

내가 setDrawsBackground를 사용하는 경우 : NO 그것을 완전히 무시하고 나는 흰색 배경을 얻을 수 있습니다. 내 솔루션은 색의 알파 구성 요소를 만질 수 없기 때문에 좋지 않습니다 (다시 말하면 필드 편집기는 다른 색을 배경으로 사용합니다).하지만 적어도 흰색 배경은 없습니다.

이 문제에 대한 실제 해결책이 있는지 궁금합니다. 필자 자신의 필드 편집기를 제공해야합니까? 그만한 가치가 있니?

내가 원했던 것은 단순히 배경이없고 포커스 링이없는 필드 편집기였으며 커서 만 깜박입니다.

감사합니다.

답변

4

문제는 흰색 배경이 -editColumn : row : withEvent : select :를 보낼 때 NSTableView에 의해 그려지는 점입니다. 셀의 rect를 + [NSColor textBackgroundColor]로 채 웁니다.

개발자 색상 공간에서 명명 된 색상의 현재 설정을 재정의하기위한 공개 API가있는 경우 -editColumn : row : withEvent : select : 등의 재정의 내에 설정할 수 있습니다. 나는 그런 API를 기억하지 않는다 (포인터는 높이 평가된다). 또한이 코드는 Snow Leopard에서만 테스트했습니다 (아래 Leopard SDK 부록 참조). 지원하려는 실제 SDK 및 런타임 환경에 대한 코드를 확인하십시오.

NSTableView에는 채우기 색상에 사용되는 개인용 접근자가 있지만 읽기 전용 속성입니다. 세터가 없으므로 표준 NSTableView에서 값을 변경할 수 없습니다. 우리는 그것을 하위 클래스 화해야합니다. (당신이 outlineView에서 같은 동작을 원하는 NSOutlineView 이미 NSTableView는의 서브 클래스이기 때문에, 우리는 코드가 동일 슈퍼 클래스 제외하고, NSOutlineView를 서브 클래 싱 것이다.하지만 있습니다.)

@interface ASCOutlineView : NSOutlineView { 

} 

@end 

@implementation ASCOutlineView 

- _textBackgroundColor 
{ 
    return ([NSColor clearColor]); 
} 

@end 

는 것 같다 Snow Leopard에서 테이블 셀을 편집 할 때 눈부신 흰색 블록이 HUD를 망치는 것을 방지해야합니다.

Leopard SDK에 대해 컴파일 된 앱은 조금 더 많은 지원이 필요합니다. Leopard의 tableView는 일부 렌더링 속성을 하드 코딩하여 선택 방법을 재정의해야 할 수도 있습니다.

NSTextFieldCells는 실제로 컨트롤 내부에서 사용할 수 있도록 NSTextViews의 래퍼입니다. 그것들은 일반적으로 window (또는이 경우에는 그 서브 클래스, 패널)에 의해 관리되는 동일한 textView 인스턴스를 공유합니다. NSTableView는 데이터 편집을위한 시스템 UI 설정을 따르도록 NSTextFieldCell의 설정을 변경합니다. 대개. 그런 다음 NSTextFieldCell은 해당 설정을 NSTextView로 전달합니다. 이 파이프 라인의 어느 지점에서나 우리 고유의 UI와 일치하도록 해당 속성 값을 변경하기 위해 메서드를 재정의 할 수 있습니다.

- [NSTextFieldCell setDrawsBackground :]는 올바른 결과를 얻기 위해 약간의 노력이 필요하기 때문에 사용합니다.또한 어떤 다른 객체가 그 상태에 의존 할 수있는 상황에서 우리가 달성하고자하는 효과와 내부 상태를 일관되게 유지하는 것도 중요합니다.

@interface ASCTextFieldCell : NSTextFieldCell { 

} 

@end 

@implementation ASCTextFieldCell 

- (void)setDrawsBackground: (BOOL)flag 
{ 
    [super setDrawsBackground: NO]; 
} 

@end 

그리고 편집중인 셀의 포커스 링이 나타나지 않도록하려면 포커스 링 유형 설정을 변경하는 것이 중요합니다. 실망스럽게도 IB는이 속성에 대한 액세스를 제공하지 않으므로 프로그래밍 방식으로 수행해야합니다.

for(eachColumn in [hudOutlineView tableColumns]) 
{ 
    columnCell = [[ASCTextFieldCell alloc] initTextCell: @""]; 
    [eachColumn setDataCell: columnCell]; 

    if([columnCell respondsToSelector: @selector(setFocusRingType:)] != NO) 
     [(NSTextFieldCell *)columnCell setFocusRingType: NSFocusRingTypeNone]; 
} 
0

필드 편집기 뒤에 다른 배경이 흰색으로 그려져있는 것처럼 보입니다. 아마, NSCell, 또는 행의 배경, 다른 무엇이든지.