2014-01-10 7 views
1

내 앱의 일부 프리젠 테이션에서 가독성을 높이기 위해 NSTableView에서 글꼴 크기를 늘려야합니다 (보기 기반 모드). 글꼴을 변경NSTableView : 셀의 텍스트 크기를 올바르게 조정하는 방법

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 내에서 잘 작동 :

NSTableCellView *cellView = [tableView makeViewWithIdentifier:identifier owner:self]; 
    [cellView.textField setFont:self.tableFont]; 
    cellView.textField.stringValue = rowData[row]; 
    [cellView.textField setNeedsDisplay:YES]; 

가 나는 또한 - (CGFloat) tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row로 rowHeight에 업데이트,이 또한 작동합니다

- (CGFloat) tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row { 
    if (self.tableFont) { 
     NSLog(@"Setting row height to %.1f", [self.tableFont pointSize]+8); 
     return [self.tableFont pointSize] + 8; 
    } 
    return [NSFont systemFontSize] + 8; 
} 

는 (방법 아마 올바른을 결정하는 더 우아한 방법이 있습니다 높이)

내 문제는 다음과 같습니다. 글꼴이 변경되는 것을 볼 수 있습니다. 또한 rowHeight가 변경되는 것을 볼 수 있습니다 (대체 행 채색을 사용할 때 멋지게 표시됨). 그러나 셀 내의 텍스트는 오래된 높이 (아마도 17 픽셀)로 잘려서 보이므로 글꼴 크기가 커지면 필기의 맨 위와 공백을 확인한 다음 다시 다음 행의 맨 위 부분 만 볼 수 있습니다 . 그것의 오래된 높이 몇 가지보기를 클립 NSTableViewCell처럼 보이는 나를 위해

... 난 이미 다른 값으로 프레임과 경계를 설정 연주하지만,이 아무것도 변경하지 않은 :

NSRect rect = [cellView.textField frame]; 
    rect.origin.y = 1; 
    rect.size.height = [self.tableFont pointSize] + 6; 
    [[cellView.textField cell] setFrame:rect]; 
    [cellView.textField setFrame:rect]; 
    [cellView.textField setBounds:rect]; 
    [cellView.textField setNeedsDisplay:YES]; 
    [cellView setFrame:rect]; 
    [cellView setBounds:rect]; 
    [cellView setNeedsDisplay:YES]; 

I을 가지 여기 분실하고 ...

덕분에 내가 뭔가를 간단 말이냐 생각하지만, 내가보기 위하여 어디 아무 생각이 없다, 월

답변

2

당신은 당신의 제약이 있으므로 설정되어 있는지 확인해야 NSTextField는 자동으로 증가 할 수 있습니다. autolayout 패스가 맞았습니다. NSTextField 높이에 ANY 제약 조건이 없어야합니다. fontSize를 기반으로 한 고유 높이가 있기 때문입니다.

또한 뷰 뷰 모드에서는 cellView의 'textField'및 'imageView'아웃렛이 특별히 처리되는 잘못된 기능이 있습니다. NSTableCellView에서 프레임을 textField에 직접 직접 설정하고 -viewWillDraw에 imageView를 설정합니다. 수평 제약 조건을 무시하고 레이아웃에 대한 자체 규칙을 위반합니다. (이것은 Radars 11713245 & 15359487로 출원 됨).

다음은 10.8 및 10.9의 사용자 지정 NSTableCellView 클래스에서이 잘못된 기능을 해결하기 위해 사용하는 코드입니다. 필자의 경우 필자는 필드의 x 오프셋을 재설정해야했습니다.

#pragma mark NSView 

- (void)viewWillDraw; 
{ 
    const NSRect imageViewFrame = self.imageView.frame, textFieldFrame = self.textField.frame; 

    [super viewWillDraw]; // NSTableCellView in source list-mode outline view will apply custom metrics and positioning here by calling -_doStandardRowSizeStyleLayout, which manually calls setFrame: on the textField and imageView, screwing up our autolayout... 

    // ...so put the x offsets back the way we really wanted them, dammit (Radar 11713245, 15359487) 
    if (imageViewFrame.origin.x != self.imageView.frame.origin.x) 
     [self.imageView setFrameOrigin:(NSPoint){imageViewFrame.origin.x, self.imageView.frame.origin.y}]; 

    if (textFieldFrame.origin.x != self.textField.frame.origin.x) 
     [self.textField setFrameOrigin:(NSPoint){textFieldFrame.origin.x, self.textField.frame.origin.y}]; 
    if (textFieldFrame.size.width != self.textField.frame.size.width) 
     [self.textField setFrameSize:(NSSize){textFieldFrame.size.width, self.textField.frame.size.height}]; 
} 
+0

답변 해 주셔서 감사합니다. Wil! 모든 제약 조건을 확인하고 NSTextField를 망칠 인터페이스 작성기를 보지 못했습니다. 두 가지 제약 조건 (Constraint : )이 생성되었지만이를 제거해도 아무런 영향이 없었습니다. – janu

+0

텍스트 필드의 프레임 크기가 인터페이스 작성기의 NSTableCellView.textField 하위 클래스 요소에 대해 정의한 것으로 고정되어있는 것처럼 보입니다. 심지어 viewWillDraw에서 재정의 할 수도 없습니다. 해결 방법으로, 이제 NSTableCellView.textField 프레임을위한 거대한 설정을 사용합니다 ... 지금 당장 작동합니다. – janu

+0

그래서 내 진짜 질문은 : 프레임 크기가 프로그램 실행 중에 IB에 입력 한 프레임 크기로 고정 된 이유는 무엇입니까? 테이블 뷰의 행 높이는 '자동', '고정되지 않음'으로 설정됩니다. – janu