몇 가지 추가 웹 검색 및 실험을 통해, 나는 내 자신의 대부분의 질문에 대답 할 수
NSOUTLINEVIEW의 첫 번째 열을 강조
난 단지에 걸쳐 나타나는 선택 강조 표시를 할 수 있었다 NSOutlineView를 서브 클래 싱하고 그것은 내가 내 사용자 지정 NSCe을 무시했다는 것을주의하는 것이 중요
- (void)highlightSelectionInClipRect:(NSRect)clipRect
{
NSRange visibleRowIndexes = [self rowsInRect:clipRect];
NSIndexSet *selectedRowIndexes = [self selectedRowIndexes];
NSInteger currentRow = visibleRowIndexes.location;
NSInteger lastRow = currentRow + visibleRowIndexes.length;
NSColor *highlightColor;
//Determine color of selection bar based on key/main/first responder status.
if (self == [[self window] firstResponder] && [[self window] isMainWindow] && [[self window] isKeyWindow]) {
highlightColor = [NSColor colorWithDeviceRed:0.0 green:0.0 blue:0.3 alpha:1.0];
} else
highlightColor = [NSColor lightGrayColor];
}
[highlightColor setFill];
//Get the Rect of only the name column. This is the only column that will be highlighted.
//We'll intersect this rect with the row rect for the area to fill in.
NSInteger nameColumn = [self columnWithIdentifier:@"name"];
NSRect nameColumnRect = [self rectOfColumn:nameColumn];
while (currentRow < lastRow) {
if ([selectedRowIndexes containsIndex:currentRow]) {
NSRect drawRect = NSIntersectionRect([self rectOfRow:currentRow], nameColumnRect);
NSRectFill(drawRect);
}
currentRow++;
}
}
을 구현하여 첫 번째 열의 선택한 행 LL 서브 클래스의 drawInteriorWithFrame : 원한다면 InView : 방법은 다음과 같이 표준 하이라이트 그리기에서 그것을 유지 :
-(void) drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
//do drawing here...don't call super.
}
그래서 질문의 일부에 대한 해결책이있다. 이것이 "올바른"방법이 아니라면 알려주십시오 :).
클릭하기/IN이 VIS/LOCK 열이 나는 내가
-(NSIndexSet *) outlineView:(NSOutlineView *)outlineView selectionIndexesForProposedSelection:(NSIndexSet *)proposedSelectionIndexes
방법으로이 일을해야한다고 지금 결정했습니다 선택 을 변경하지 마십시오 마우스로 끄는. 가시성 또는 잠금 열에서 발생한 드래그의 중간에있는 경우 현재 선택 된 행을 반환하여 선택 항목을 동일하게 유지합니다. 아직 구현하지는 못했지만 일단 최종 문제가 해결되면 쉽게 해결해야합니다 (아래 참조). 나는이 일에 정말 가까이 얻고 그들의 주에게
을 변경 위 또는 가시성/잠겨 열에 끌어 내리는
. 내 사용자 지정 NSCell에, 나는 다음과 같은 세 가지 방법을 무시했습니다
-(BOOL) startTrackingAt:(NSPoint)startPoint inView:(NSView *)controlView
-(BOOL) continueTracking:(NSPoint)lastPoint at:(NSPoint)currentPoint inView:(NSView *)controlView
-(void) stopTracking:(NSPoint) lastPoint at:(NSPoint)stopPoint inView:(NSView *)controlView mouseIsUp:(BOOL)flag
내 마지막 문제까지있어, 그리고 여기있다 : 나는 때 드래그 동작을 내부에있어 때 내가 알 필요가 드래그 작업이 완료됩니다. 에서 : 원한다면 InView 내가 (그래서 기본을 어떤 값도 반환하지 않는다), 그 다음 나는 stopTracking를받을 내 NSCell에 서브 클래스에없는 재정을
+(BOOL) prefersTrackingUntilMouseUp
을 경우
: 나는이 작업을 수행 할 수있는 두 가지 방법이있다 : mouseIsUp : 드래그 작업 중에 셀을 떠나서 다음 셀로 이동할 때마다 메시지 ...이 방법을 사용하여 드래그 작업이 언제 완료되는지 확인할 수 없습니다. ... 단지 훌륭 마우스 최대에 전화 ...하지만 문제는 테이블 아무튼입니다 : 내가 재정
+(BOOL) prefersTrackingUntilMouseUp
을하고 YES 돌아 대신하는 경우
, 나는 stopTracking를 얻을 수 mouseDown에있는 셀의 UI를 업데이트하는 것처럼 보이거나 셀 안쪽으로 드래그하는 중입니다. 예를 들어, startTracking : ... 메서드에서 셀의 objectValue를 nil로 설정하면 (이미지가 더 이상 표시되지 않도록) 마우스 버튼이 다시 올라갈 때까지 커서가 업데이트되지 않습니다. 세포. prefersTrackingUntilMouseUp가 NO를 반환하면 즉시 업데이트됩니다.
그래서 둘 다 (mouseDown에서) 즉시 셀 UI를 업데이트 할 수 있어야하며 드래그 작업이 완료되는 시점을 알 수 있어야합니다. 이것은 퍼즐의 마지막 부분입니다. 누구든지 도와 줄 수 있습니까?
무엇이 잘못되었는지 알아 냈습니다. 내 "drawInteriorWithFrame"은 셀의 이미지 속성을 그렸습니다 ... 객체 값이 아닙니다. 마우스가 셀을 떠날 때까지 이미지가 업데이트되지 않았습니다! –
나는 이것이 동일한 질문이있는 경우에 다른 사람이이 답변을 따를 수 있도록 귀하의 질문에 대한 최종 답을 볼 수 있습니다. –
고마워요 ... 여기 새로 왔습니다! –