동적 높이가있는 행이있는보기 기반 NSTableView


84

뷰 기반이있는 응용 프로그램이 NSTableView있습니다. 이 테이블 뷰 NSTextField에는 단어 줄 바꿈이 활성화 된 다중 행으로 구성된 콘텐츠가있는 셀이있는 행이 있습니다 . 의 텍스트 내용에 NSTextField따라 셀을 표시하는 데 필요한 행의 크기가 달라집니다.

높이를 반환 하는 NSTableViewDelegate방법을 구현할 수 있다는 것을 알고 tableView:heightOfRow:있지만 높이는 NSTextField. 의 단어 줄 바꿈은의 NSTextField너비에 따라 유사하게 NSTextField...의 너비에 따라 결정됩니다 NSTableView.

Soooo… 제 질문은… 이것에 대한 좋은 디자인 패턴은 무엇입니까? 내가 시도하는 모든 것이 복잡한 엉망인 것 같습니다. TableView는 셀을 배치하기 위해 셀의 높이에 대한 지식을 필요로하고 ... NSTextField단어 줄 바꿈을 결정하기 위해 레이아웃에 대한 지식이 필요하기 때문에 ... 셀은 높이를 결정하기 위해 워드 랩에 대한 지식이 필요합니다. 그리고 그것은 나를 미치게 만듭니다.

제안?

중요한 경우 최종 결과도 편집 가능 NSTextFields하며 그 안에있는 텍스트에 맞게 크기가 조정됩니다. 이미 뷰 레벨에서 작업하고 있지만 tableview는 아직 셀 높이를 조정하지 않습니다. 높이 문제가 해결되면- noteHeightOfRowsWithIndexesChanged메서드를 사용 하여 높이가 변경되었음을 테이블 뷰에 알릴 것입니다.하지만 여전히 델리게이트에게 높이를 물어볼 것입니다. 따라서 제 질문입니다.

미리 감사드립니다!


뷰의 너비와 높이가 내용에 따라 변경 될 수있는 경우 반복해야하기 때문에 정의가 복잡합니다 (하지만 캐시 할 수 있음). 그러나 귀하의 케이스는 일정한 너비에 대해 높이가 변경되는 것 같습니다. 너비가 알려진 경우 (즉, 창 또는보기의 너비를 기반으로 함) 여기에 복잡한 것은 없습니다. 너비가 가변적 인 이유가 무엇입니까?
Rob Napier

내용에 따라 높이 만 변경할 수 있습니다. 그리고 저는 이미 그 문제를 해결했습니다. 높이를 자동으로 조정하는 NSTextField 하위 클래스가 있습니다. 문제는 그 조정에 대한 지식을 테이블 뷰의 델리게이트로 다시 가져와 그에 따라 높이를 업데이트 할 수 있다는 것입니다.
Jiva DeVoe 2011 년

@Jiva :이 문제를 아직 해결했는지 궁금합니다.
Joshua Nozzi 2011

비슷한 일을하려고합니다. 자체 높이를 조정하는 NSTextField 하위 클래스의 아이디어가 마음에 듭니다. 해당 하위 클래스에 높이 변경에 대한 (위임) 알림을 추가하고 적절한 클래스 (데이터 소스, 개요 델리게이트 등)로이를 모니터링하여 개요에 대한 정보를 얻는 것은 어떻습니까?
John Velman 2011

여기에있는 것보다 더 많은 도움이 된 답변이있는 관련성이 높은 질문 : NSTableView Row Height based on NSStrings .
Ashley

답변:


132

이것은 닭고기와 달걀 문제입니다. 테이블은 주어진 뷰가 놓일 위치를 결정하기 때문에 행 높이를 알아야합니다. 그러나 뷰가 이미 주변에 있기를 원하므로 행 높이를 알아내는 데 사용할 수 있습니다. 그래서, 어느 것이 먼저입니까?

대답은 NSTableCellView뷰의 높이를 측정 하기 위해 추가 (또는 "셀 뷰"로 사용하는 뷰 )를 유지하는 것 입니다. 에서 tableView:heightOfRow:위임 방법, '행'과 설정에 대한 액세스 모델 objectValueNSTableCellView. 그런 다음보기의 너비를 테이블의 너비로 설정하고 원하는대로 해당보기에 필요한 높이를 파악합니다. 그 값을 반환하십시오.

호출하지 마십시오 noteHeightOfRowsWithIndexesChanged:대의원 방법에서 tableView:heightOfRow:viewForTableColumn:row:! 그것은 나쁘고 큰 문제를 일으킬 것입니다.

높이를 동적으로 업데이트하려면 (타겟 / 액션을 통해) 텍스트 변경에 응답하고 해당 뷰의 계산 된 높이를 다시 계산해야합니다. 이제 NSTableCellView의 높이 (또는 "셀보기"로 사용중인보기)를 동적으로 변경하지 마십시오 . 테이블 해당 뷰의 프레임을 제어 해야 하며 설정하려고하면 테이블 뷰와 싸우게됩니다. 대신 높이를 계산 한 텍스트 필드에 대한 대상 / 작업에서을 호출 noteHeightOfRowsWithIndexesChanged:하면 테이블이 해당 개별 행의 크기를 조정할 수 있습니다. 하위 뷰 (예 :의 하위 뷰)에 자동 크기 조정 마스크 설정이 있다고 가정하면 NSTableCellView크기가 잘 조정되어야합니다! 그렇지 않은 경우 먼저 하위 뷰의 크기 조정 마스크에서 작업하여 가변 행 높이로 문제를 해결하십시오.

noteHeightOfRowsWithIndexesChanged:기본적으로 애니메이션 된다는 것을 잊지 마십시오 . 애니메이션하지 않으려면 :

[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0];
[tableView noteHeightOfRowsWithIndexesChanged:indexSet];
[NSAnimationContext endGrouping];

추신 : 저는 스택 오버플로보다 Apple Dev Forums에 게시 된 질문에 더 많이 답변합니다.

PSS : NSTableView 기반 뷰를 작성했습니다.


응답 해 주셔서 감사합니다. 원래 본 적이 없는데 ... 정답으로 표시했습니다. 개발자 포럼도 훌륭합니다. 저도 사용합니다.
Jiva DeVoe

"해당 뷰에 필요한 높이를 계산합니다. 해당 값을 반환합니다." .. 그게 내 문제입니다 :(. 저는 뷰 기반 tableView를 사용하고 있는데 어떻게
해야할지 모르겠어요

@corbin 대답 해 주셔서 감사합니다. 이것이 제 앱에 있던 것입니다. 그러나 Mavericks와 관련하여 문제를 발견했습니다. 이 주제에 대해 분명히 알고 계시므로 제 질문을 확인해 주시겠습니까? 여기 : stackoverflow.com/questions/20924141/…
Alex

1
@corbin에 대한 정식 답변이 있지만 NSTableViews와 함께 자동 레이아웃 및 제약 조건을 사용합니까? 자동 레이아웃에 대한 잠재적 인 솔루션이 있습니다. 예상 HeightForRowAtIndexPath API (Cocoa에 포함되지 않음) 없이도 충분할지 궁금합니다.
ZS

3
@ZS : 저는 자동 레이아웃을 사용하고 있으며 Corbin의 답변을 구현했습니다. 에서가 tableView:heightOfRow:, 나 행의 값을 내 여분의 전지보기를 설정 (I은 하나의 열이), 그리고 반환 cellView.fittingSize.height. fittingSize제약 조건을 충족하는 뷰의 최소 크기를 계산하는 NSView 메서드입니다.
Peter Hosey

43

이에 훨씬 쉬워졌습니다 맥 OS 10.13.usesAutomaticRowHeights. 자세한 내용은 https://developer.apple.com/library/content/releasenotes/AppKit/RN-AppKit/#10_13("NSTableView 자동 행 높이 "섹션)에 있습니다.

기본적으로 NSTableView또는 NSOutlineView스토리 보드 편집기에서 선택하고 크기 검사기에서이 옵션을 선택합니다.

여기에 이미지 설명 입력

그런 다음 NSTableCellView셀에 대한 상단 및 하단 제약 조건을 갖도록 항목 을 설정하면 셀 크기가 자동으로 조정됩니다. 코드가 필요하지 않습니다!

앱은 heightOfRow( NSTableView) 및 heightOfRowByItem( NSOutlineView)에 지정된 높이를 무시합니다 . 이 방법으로 자동 레이아웃 행에 대해 계산되는 높이를 확인할 수 있습니다.

func outlineView(_ outlineView: NSOutlineView, didAdd rowView: NSTableRowView, forRow row: Int) {
  print(rowView.fittingSize.height)
}

@tofutim : 올바른 제약 조건을 사용하고 동적 높이가있는 각 NSTextField의 기본 너비 설정이 자동으로 설정되었는지 확인하는 경우 래핑 된 텍스트 셀에서 올바르게 작동하는 경우. 참조 stackoverflow.com/questions/46890144/…
Ely

나는 @tofutim이 옳다고 생각합니다 .NSTextView를 TableView에 넣으면 작동하지 않습니다. 아카이브를 시도하지만 작동하지 않습니다. 하지만 NSImage와 같은 다른 구성 요소에서도 작동합니다.
Albert

나는 행에 대해 고정 된 높이를 사용하지만 나를 위해 작동하지 않습니다
켄 지라에게

2
왜 그것이 나를 위해 작동하지 않는지 알아 낸 며칠 후에 나는 그것이 TableCellView편집 할 수 없을 때만 작동한다는 것을 발견했습니다 . 중요하지 않음은 Attributes [Behavior : Editable] 또는 Bindings Inspector [Conditionally Set Editable : Yes]에서 확인됩니다
Łukasz

테이블 셀에 실제 높이 제약 조건을 적용하는 것이 얼마나 중요한지 강조하고 싶습니다. 저는 그렇지 않았기 때문에 셀의 계산 된 fittingSize가 0.0이고 좌절감이 이어졌습니다.
green_knight

9

Corbin의 답변을 기반으로합니다 (btw 감사합니다).

macOS 10.11 (이상) 용 자동 레이아웃이있는 Swift 3,보기 기반 NSTableView

내 설정 : NSTableCellView자동 레이아웃을 사용하여 레이아웃이 있습니다. 여기에는 다른 요소 외에 NSTextField최대 2 개의 행을 가질 수 있는 여러 줄 이 포함됩니다. 따라서 전체 셀보기의 높이는이 텍스트 필드의 높이에 따라 달라집니다.

두 가지 경우에 높이를 업데이트하도록 테이블 뷰를 업데이트합니다.

1) 테이블보기 크기가 조정되는 경우 :

func tableViewColumnDidResize(_ notification: Notification) {
        let allIndexes = IndexSet(integersIn: 0..<tableView.numberOfRows)
        tableView.noteHeightOfRows(withIndexesChanged: allIndexes)
}

2) 데이터 모델 개체가 변경되는 경우 :

tableView.noteHeightOfRows(withIndexesChanged: changedIndexes)

이렇게하면 테이블 뷰가 대리자에게 새 행 높이를 요청합니다.

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {

    // Get data object for this row
    let entity = dataChangesController.entities[row]

    // Receive the appropriate cell identifier for your model object
    let cellViewIdentifier = tableCellViewIdentifier(for: entity)

    // We use an implicitly unwrapped optional to crash if we can't create a new cell view
    var cellView: NSTableCellView!

    // Check if we already have a cell view for this identifier
    if let savedView = savedTableCellViews[cellViewIdentifier] {
        cellView = savedView
    }
    // If not, create and cache one
    else if let view = tableView.make(withIdentifier: cellViewIdentifier, owner: nil) as? NSTableCellView {
        savedTableCellViews[cellViewIdentifier] = view
        cellView = view
    }

    // Set data object
    if let entityHandler = cellView as? DataEntityHandler {
        entityHandler.update(with: entity)
    }

    // Layout
    cellView.bounds.size.width = tableView.bounds.size.width
    cellView.needsLayout = true
    cellView.layoutSubtreeIfNeeded()

    let height = cellView.fittingSize.height

    // Make sure we return at least the table view height
    return height > tableView.rowHeight ? height : tableView.rowHeight
}

먼저, 행 ( entity)에 대한 모델 객체 와 적절한 셀 뷰 식별자를 가져와야합니다. 그런 다음이 식별자에 대한 뷰를 이미 생성했는지 확인합니다. 이를 위해 각 식별자에 대한 셀 뷰가있는 목록을 유지해야합니다.

// We need to keep one cell view (per identifier) around
fileprivate var savedTableCellViews = [String : NSTableCellView]()

저장되지 않은 경우 새 항목을 만들고 캐시해야합니다. 모델 객체로 셀 뷰를 업데이트하고 현재 테이블 뷰 너비를 기반으로 모든 것을 다시 레이아웃하도록 지시합니다. fittingSize높이는 다음의 새로운 높이로 사용할 수 있습니다.


이것이 완벽한 답입니다. 열이 여러 개인 경우 경계를 테이블 너비가 아닌 열 너비로 설정하는 것이 좋습니다.
Vojto 2017-04-26

또한를 설정할 cellView.bounds.size.width = tableView.bounds.size.width때 높이를 낮은 숫자로 재설정하는 것이 좋습니다. 이 더미 뷰를 재사용하려는 경우 낮은 수로 설정하면 피팅 크기가 "재설정"됩니다.
Vojto 2017-04-28

7

더 많은 코드를 원하는 사람을 위해 내가 사용한 전체 솔루션은 다음과 같습니다. 저를 올바른 방향으로 안내 해준 corbin dunn에게 감사드립니다.

나는 주로 NSTextView나의 높이와 관련하여 높이를 설정해야했습니다 NSTableViewCell.

내 하위 클래스에서 NSViewController임시로 다음을 호출하여 새 셀을 만듭니다.outlineView:viewForTableColumn:item:

- (CGFloat)outlineView:(NSOutlineView *)outlineView heightOfRowByItem:(id)item
{
    NSTableColumn *tabCol = [[outlineView tableColumns] objectAtIndex:0];
    IBAnnotationTableViewCell *tableViewCell = (IBAnnotationTableViewCell*)[self outlineView:outlineView viewForTableColumn:tabCol item:item];
    float height = [tableViewCell getHeightOfCell];
    return height;
}

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
    IBAnnotationTableViewCell *tableViewCell = [outlineView makeViewWithIdentifier:@"AnnotationTableViewCell" owner:self];
    PDFAnnotation *annotation = (PDFAnnotation *)item;
    [tableViewCell setupWithPDFAnnotation:annotation];
    return tableViewCell;
}

내에서 IBAnnotationTableViewCell하는 내 셀 컨트롤러 (의 서브 클래스 NSTableCellView) 내가 설정 방법을

-(void)setupWithPDFAnnotation:(PDFAnnotation*)annotation;

모든 콘센트를 설정하고 내 PDFAnnotations의 텍스트를 설정합니다. 이제 다음을 사용하여 높이를 "쉽게"계산할 수 있습니다.

-(float)getHeightOfCell
{
    return [self getHeightOfContentTextView] + 60;
}

-(float)getHeightOfContentTextView
{
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:[self.contentTextView font],NSFontAttributeName,nil];
    NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:[self.contentTextView string] attributes:attributes];
    CGFloat height = [self heightForWidth: [self.contentTextView frame].size.width forString:attributedString];
    return height;
}

.

- (NSSize)sizeForWidth:(float)width height:(float)height forString:(NSAttributedString*)string
{
    NSInteger gNSStringGeometricsTypesetterBehavior = NSTypesetterLatestBehavior ;
    NSSize answer = NSZeroSize ;
    if ([string length] > 0) {
        // Checking for empty string is necessary since Layout Manager will give the nominal
        // height of one line if length is 0.  Our API specifies 0.0 for an empty string.
        NSSize size = NSMakeSize(width, height) ;
        NSTextContainer *textContainer = [[NSTextContainer alloc] initWithContainerSize:size] ;
        NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:string] ;
        NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init] ;
        [layoutManager addTextContainer:textContainer] ;
        [textStorage addLayoutManager:layoutManager] ;
        [layoutManager setHyphenationFactor:0.0] ;
        if (gNSStringGeometricsTypesetterBehavior != NSTypesetterLatestBehavior) {
            [layoutManager setTypesetterBehavior:gNSStringGeometricsTypesetterBehavior] ;
        }
        // NSLayoutManager is lazy, so we need the following kludge to force layout:
        [layoutManager glyphRangeForTextContainer:textContainer] ;

        answer = [layoutManager usedRectForTextContainer:textContainer].size ;

        // Adjust if there is extra height for the cursor
        NSSize extraLineSize = [layoutManager extraLineFragmentRect].size ;
        if (extraLineSize.height > 0) {
            answer.height -= extraLineSize.height ;
        }

        // In case we changed it above, set typesetterBehavior back
        // to the default value.
        gNSStringGeometricsTypesetterBehavior = NSTypesetterLatestBehavior ;
    }

    return answer ;
}

.

- (float)heightForWidth:(float)width forString:(NSAttributedString*)string
{
    return [self sizeForWidth:width height:FLT_MAX forString:string].height ;
}

heightForWidth : forString : 구현 된 위치는 어디입니까?
ZS 2014

미안합니다. 답변에 추가했습니다. 원본 SO 게시물을 찾으려고 시도했지만 찾을 수 없었습니다.
Sunkas 2014

1
감사! 거의 효과가 있지만 결과가 정확하지 않습니다. 제 경우에는 NSTextContainer에 입력하는 너비가 잘못된 것 같습니다. NSTableViewCell의 하위보기를 정의하기 위해 자동 레이아웃을 사용하고 있습니까? "self.contentTextView"의 너비는 어디에서 왔습니까?
ZS 2014

내 문제에 대한 질문을 여기에 게시했습니다 : stackoverflow.com/questions/22929441/…
ZS

3

나는 꽤 오랫동안 해결책을 찾고 있었고 내 경우에는 잘 작동하는 다음과 같은 해결책을 찾았습니다.

- (double)tableView:(NSTableView *)tableView heightOfRow:(long)row
{
    if (tableView == self.tableViewTodo)
    {
        CKRecord *record = [self.arrayTodoItemsFiltered objectAtIndex:row];
        NSString *text = record[@"title"];

        double someWidth = self.tableViewTodo.frame.size.width;
        NSFont *font = [NSFont fontWithName:@"Palatino-Roman" size:13.0];
        NSDictionary *attrsDictionary =
        [NSDictionary dictionaryWithObject:font
                                    forKey:NSFontAttributeName];
        NSAttributedString *attrString =
        [[NSAttributedString alloc] initWithString:text
                                        attributes:attrsDictionary];

        NSRect frame = NSMakeRect(0, 0, someWidth, MAXFLOAT);
        NSTextView *tv = [[NSTextView alloc] initWithFrame:frame];
        [[tv textStorage] setAttributedString:attrString];
        [tv setHorizontallyResizable:NO];
        [tv sizeToFit];

        double height = tv.frame.size.height + 20;

        return height;
    }

    else
    {
        return 18;
    }
}

제 경우에는 해당 레이블에 표시되는 텍스트가 모두 맞도록 주어진 열을 세로로 확장하고 싶었습니다. 따라서 해당 열을 가져 와서 글꼴과 너비를 가져옵니다.
Klajd Deda

3

사용자 지정을 사용 NSTableCellView하고 NSTextField내 솔루션에 대한 액세스 권한이 있기 때문에 NSTextField.

@implementation NSTextField (IDDAppKit)

- (CGFloat)heightForWidth:(CGFloat)width {
    CGSize size = NSMakeSize(width, 0);
    NSFont*  font = self.font;
    NSDictionary*  attributesDictionary = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
    NSRect bounds = [self.stringValue boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:attributesDictionary];

    return bounds.size.height;
}

@end

감사! 당신은 나의 구세주입니다! 이것은 올바르게 작동하는 유일한 것입니다. 나는 이것을 알아 내기 위해 하루 종일을 보냈다.
Tommy


2

이 문제를 해결하기 위해 수행 한 작업은 다음과 같습니다.

출처 : "row height nstableview"에서 XCode 문서를 살펴보십시오. "TableViewVariableRowHeights / TableViewVariableRowHeightsAppDelegate.m"이라는 샘플 소스 코드를 찾을 수 있습니다.

(참고 : 표보기에서 열 1을보고 있습니다. 다른 곳을 보려면 조정해야합니다.)

Delegate.h에서

IBOutlet NSTableView            *ideaTableView;

Delegate.m에서

테이블보기는 행 높이 제어를 위임합니다.

    - (CGFloat)tableView:(NSTableView *)tableView heightOfRow:(NSInteger)row {
    // Grab the fully prepared cell with our content filled in. Note that in IB the cell's Layout is set to Wraps.
    NSCell *cell = [ideaTableView preparedCellAtColumn:1 row:row];

    // See how tall it naturally would want to be if given a restricted with, but unbound height
    CGFloat theWidth = [[[ideaTableView tableColumns] objectAtIndex:1] width];
    NSRect constrainedBounds = NSMakeRect(0, 0, theWidth, CGFLOAT_MAX);
    NSSize naturalSize = [cell cellSizeForBounds:constrainedBounds];

    // compute and return row height
    CGFloat result;
    // Make sure we have a minimum height -- use the table's set height as the minimum.
    if (naturalSize.height > [ideaTableView rowHeight]) {
        result = naturalSize.height;
    } else {
        result = [ideaTableView rowHeight];
    }
    return result;
}

새 행 높이에 영향을 미치기 위해 필요합니다 (위임 방법).

- (void)controlTextDidEndEditing:(NSNotification *)aNotification
{
    [ideaTableView reloadData];
}

이게 도움이 되길 바란다.

마지막 참고 : 이것은 열 너비 변경을 지원하지 않습니다.


락! :) 감사합니다.
flagman

4
불행히도 Apple 샘플 코드 (현재 버전 1.1로 표시됨)는 뷰 기반 테이블이 아닌 셀 기반 테이블을 사용합니다 (이 질문에 대한 내용). 이 코드 -[NSTableView preparedCellAtColumn:row]는 문서에서 "NSCell 기반 테이블 뷰에서만 사용할 수 있습니다"라고 말하는을 호출합니다 . 뷰 기반 테이블에서이 메서드를 사용하면 런타임에 다음 로그 출력이 생성됩니다. "View Based NSTableView error : prepareCellAtColumn : row : was called. Please log a bug with the backtrace from this log, or stop using the method."
Ashley

1

다음은 JanApotheker의 답변을 기반으로 한 솔루션으로 cellView.fittingSize.height, 올바른 높이를 반환하지 않았기 때문에 수정되었습니다 . 제 경우 에는 셀의 textField 텍스트에 대한 표준 NSTableCellView, NSAttributedStringIB에 설정된 셀의 textField에 대한 제약 조건이있는 단일 열 테이블을 사용하고 있습니다.

내 뷰 컨트롤러에서 다음을 선언합니다.

var tableViewCellForSizing: NSTableCellView?

viewDidLoad ()에서 :

tableViewCellForSizing = tableView.make(withIdentifier: "My Identifier", owner: self) as? NSTableCellView

마지막으로 tableView 델리게이트 메서드의 경우 :

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    guard let tableCellView = tableViewCellForSizing else { return minimumCellHeight }

    tableCellView.textField?.attributedStringValue = attributedString[row]
    if let height = tableCellView.textField?.fittingSize.height, height > 0 {
        return height
    }

    return minimumCellHeight
}

mimimumCellHeight백업을 위해 30으로 설정된 상수이지만 실제로 사용되지는 않습니다. attributedStrings내 모델 배열입니다 NSAttributedString.

이것은 내 필요에 완벽하게 작동합니다. 이 성가신 문제에 대한 올바른 방향을 알려주는 모든 이전 답변에 감사드립니다.


1
아주 좋아요. 한 가지 문제. 테이블을 편집 할 수 없거나 textfield.fittingSize.height가 작동하지 않고 0을 반환합니다. set table.isEditable = false in viewdidload
jiminybob99

0

이것은 내가 이전에했던 일과 많이 비슷하게 들립니다. 간단하고 우아한 해결책을 내놓았다 고 말할 수 있었으면 좋겠지 만, 아쉽게도 그렇게하지 않았습니다. 노력의 부족이 아닙니다. 이미 셀이 빌드되기 전에 높이를 알기 위해 UITableView가 필요하다는 것을 알았으므로 실제로는 모든 것이 매우 원형으로 보입니다.

내 최선의 해결책은 논리를 셀에 밀어 넣는 것이 었습니다. 최소한 셀이 어떻게 배치되었는지 이해하는 데 필요한 클래스를 분리 할 수 ​​있었기 때문입니다. 같은 방법

+ (CGFloat) heightForStory:(Story*) story

셀의 높이를 결정할 수 있습니다. 물론 여기에는 텍스트 측정 등이 포함되었습니다. 어떤 경우에는이 방법에서 얻은 정보를 캐시하는 방법을 고안하여 셀을 만들 때 사용할 수있었습니다. 그것이 내가 생각 해낸 최고였습니다. 더 나은 대답이 있어야 할 것 같지만 그것은 분노한 문제입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.