2013-10-11 2 views
0

IB의 scrollview에서 레이어 체크 마크를 클릭하여 레이어가 백업되도록 설정된 NSScrollView가 있습니다. 그 scrollview 내에서 NSTableView 있습니다. 해당 NSTableView에서 사용자 지정 NSTableRowView 내 열 사이의 구분선에서 세로 빨간색 선을 그릴 수 있습니다. 내 NSTableView에는 2 개의 열이 있습니다. 내 스크롤 뷰를 레이어 백업으로 설정하면 열 구분선을 드래그하여 열을 넓게 또는 좁게 만들 때마다 drawBackgroundInRect가 호출되지 않기 때문에 드래그 작업 중에 백그라운드 세로선이 업데이트되지 않습니다.레이어 백 뷰에서 drawBackgroundInRect가 호출되지 않습니다.

해결 방법이 있습니까? 여기

- (void)drawBackgroundInRect:(NSRect)dirtyRect { 

[super drawBackgroundInRect:dirtyRect]; 

NSGraphicsContext *nscontext = [NSGraphicsContext currentContext]; 

[nscontext saveGraphicsState]; 

CGContextRef context = (CGContextRef)[nscontext graphicsPort]; 

if (!self.isGroupRowStyle) { 

    CGRect leftColumnRect = [(NSView *)[self viewAtColumn:0] frame]; 
    leftColumnRect.origin.y -= 1.0; 
    leftColumnRect.size.height += 2.0; 
    leftColumnRect.size.width += 1.0; 

    // grey background 

    CGContextSetGrayFillColor(context, 0.98, 1.0); 
    CGContextFillRect(context, leftColumnRect); 

    // draw nice red vertical line 

    CGContextBeginPath(context); 
    CGContextSetRGBStrokeColor(context, 0.6, 0.2, 0.2, 0.3); 

    CGContextMoveToPoint(context, leftColumnRect.size.width + 1.5, 0); 
    CGContextSetLineWidth(context, 1.0); 
    CGContextAddLineToPoint(context, leftColumnRect.size.width + 1.5, leftColumnRect.size.height); 
    CGContextStrokePath(context); 

} 
[nscontext restoreGraphicsState]; 
} 

가 열 크기 조정 때 내가 갖는 문제이다 : 여기

내가 drawBackgroundInRect에서 사용하고 코드의

enter image description here

을 그리고 이것은이 보일 것입니다 것입니다 내 스크롤 뷰가 레이어 백업으로 설정되어 있지 않은 경우와 같습니다.

감사!

답변

0

1 년이 지난 후에 마침내 내 자신의 질문에 대한 적절한 대답을 알아 냈습니다.

트릭은 NSTableColumn의 크기를 조정할 때 보이는 행 목록의 모든 행에서 setNeedsDisplay를 호출하는 것입니다. 헤더는 NSTableHeaderView 내 자신의 서브 클래스를 볼 때

- (void)tableView:(NSTableView *)tableView isResizingTableColumn:(NSTableColumn *)tableColumn { 
    NSRange range = [tableView rowsInRect:tableView.visibleRect]; 
    for (NSInteger row = range.location; row < (range.location + range.length); row++) { 
     NSTableRowView *rowView = [tableView rowViewAtRow:row makeIfNecessary:NO]; 
     [rowView setNeedsDisplay:YES]; 
    } 
} 

내 NSTableView는이 있습니다

여기 내 NSViewController 서브 클래스에서 사용하는 코드입니다. 내 NSViewController 헤더 뷰에 대한 대리자로 설정하여 사용자가 크기를 조정할 때 추적 할 수 있습니다.

TFRecordTableHeaderView.h :

#import <Cocoa/Cocoa.h> 

@protocol TFRecordTableHeaderViewDelegate <NSObject> 
- (void)tableView:(NSTableView *)tableView isResizingTableColumn:(NSTableColumn *)tableColumn; 
@end 

@interface TFRecordTableHeaderView : NSTableHeaderView 
@property (nonatomic, assign) id<TFRecordTableHeaderViewDelegate>delegate; 
@end 

TFRecordTableHeaderView.m :

#import "TFRecordTableHeaderView.h" 

@implementation TFRecordTableHeaderView 

- (id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 

    if (self) { 
     // Initialization code here. 
    } 

    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect { 
    [super drawRect:dirtyRect]; 
    // do some custom drawing here 
} 

// track resizing of the column as it happens 
// from the docs: If the user is resizing a column in the receiver, returns the index of that column. 

- (NSInteger)resizedColumn { 
    NSInteger columnIndex = [super resizedColumn]; 

    if (columnIndex >= 0) { 
     NSTableColumn *column = [self.tableView.tableColumns objectAtIndex:columnIndex]; 

     if ([self.delegate respondsToSelector:@selector(tableView:isResizingTableColumn:)]) { 
      [self.delegate tableView:self.tableView isResizingTableColumn:column]; 
     } 
    } 

    return columnIndex; 
} 

@end 

은 그냥 NSTableView는 헤더보기로 NSTableHeaderView 서브 클래스를 설정합니다. 이제 머리글에서 열을 끌 때마다 isResizingTableColumn 대리자 메서드가 호출됩니다. NSViewController 하위 클래스에 isResizingTableColumn을 구현할 수 있습니다.

이제 열의 크기를 조정하면 isResizingTableColumn이 호출되어 보이는 rect에 대한 NSTableRowViews가 생성되고 setNeedsDisplay가 전송됩니다. 그러면 행을 새로 고치고 드래그하는 동안 drawBackgroundInRect 메서드가 호출됩니다. 이렇게하면 내 맞춤형 세로 격자 선이 새로 고쳐집니다.

NSTableView에서 맨 위에 그룹화 된 행 위에 수직 그리드 선을 그리는 것을 피하려면이 모든 것이 필요합니다. 나는 이것이 NSTableView에 내장되어야한다고 생각한다. 그룹 섹션 헤더에 텍스트가 있고 텍스트 상단에 수직 그리드 선이있는 경우 정말 안좋은 모양입니다.지금은 그것에 대해 생각

, 당신이 당신 NSTableHeaderView 서브 클래스에이 권리를 할 수있는 : 내 경우

- (NSInteger)resizedColumn { 
    NSInteger columnIndex = [super resizedColumn]; 

    if (columnIndex >= 0) {   
     NSRange range = [self.tableView rowsInRect:self.tableView.visibleRect]; 
     for (NSInteger row = range.location; row < (range.location + range.length); row++) { 
      NSTableRowView *rowView = [self.tableView rowViewAtRow:row makeIfNecessary:NO]; 
      [rowView setNeedsDisplay:YES]; 
     } 
    } 

    return columnIndex; 
} 

을 내 NSViewController 서브 클래스에 그 일을했다 나는 또한이었다 하나의 테이블 열을 크기를 조정하면서 때문에 똑같이 다른 크기 조정. 이것은 NSTableView가 UITableView와 같은 바닥 글의 개념을 가지고 있지 않기 때문에 하나의 행만있는 비슷하게 구성된 테이블과 바닥 글 행을 시뮬레이트했습니다.

관련 문제