programing

스토리보드의 사용자 지정 셀 행 높이 설정이 응답하지 않습니다.

goodsources 2023. 4. 11. 21:59
반응형

스토리보드의 사용자 지정 셀 행 높이 설정이 응답하지 않습니다.

테이블 뷰에 있는 셀 중 하나의 셀 높이를 조정하려고 합니다.해당 셀의 "size inspector" 내 "row height" 설정에서 사이즈를 조정하고 있습니다.iPhone에서 앱을 실행하면 셀의 기본 크기가 테이블 뷰의 "열 크기"에서 설정됩니다.

표 보기의 "행 크기"를 변경하면 모든 셀의 크기가 변경됩니다.저는 한 셀만 커스텀 사이즈로 하고 싶기 때문에 그렇게 하고 싶지 않습니다.저는 이 문제에 대한 프로그램적인 해결책이 있는 게시물을 많이 보았지만, 가능하다면 스토리보드를 통해 하고 싶습니다.

다이내믹 셀에서는rowHeight[ ]로하면, 셀의 덮어씁니다.[ UITableView ]는 행 높이보다 우선됩니다.

하지만 정적 세포에서는rowHeight[ UITable View ]를 선택합니다.

버그인지 아닌지는 모르겠지만, 애플이 고의로 이것을 하고 있는 것은 아닐까요?

UITableViewController 를 사용하는 경우는, 다음의 방법을 실장합니다.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

행 기능에서 높이를 선택할 수 있습니다.예를들면,

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == 0) {
       return 100;
    } 
    else {
       return 60;
    }
}

이 예에서 첫 번째 행의 높이는 100픽셀이고 나머지 행은 60픽셀입니다.

이게 도움이 됐으면 좋겠어요.

셀의 rowHeight 에 싣다UITableView셀의 셀보다 합니다.rowHeight

IMO를 사용하다UI를 두 곳에서 관리해야 할 때마다 오류가 발생하기 쉽습니다.를 들어,셀, 셀.heightForRowAtIndexPath:까지, , 「」를 덮어쓰는 입니다.heightForRowAtIndexPath:단, 매직 넘버를 사용하는 대신 스토리보드의 실제 프로토타입 셀을 사용하여 높이를 결정합니다.다음은 예를 제시하겠습니다.

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* In this example, there is a different cell for
       the top, middle and bottom rows of the tableView.
       Each type of cell has a different height.
       self.model contains the data for the tableview 
    */
    static NSString *CellIdentifier;
    if (indexPath.row == 0) 
        CellIdentifier = @"CellTop";
    else if (indexPath.row + 1 == [self.model count] )
        CellIdentifier = @"CellBottom";
    else
        CellIdentifier = @"CellMiddle";

    UITableViewCell *cell = 
              [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    return cell.bounds.size.height;
}

그러면 실행 시 프로토타입 셀 높이에 대한 모든 변경 사항이 자동으로 선택되고 스토리보드라는 한 곳에서 UI만 관리하면 됩니다.

다양한 답변/댓글이 암시하는 코드를 만들어 프로토타입 셀을 사용하는 스토리보드에 사용할 수 있도록 했습니다.

다음 코드:

  • 스토리보드의 눈에 띄는 장소 이외에는 셀 높이를 설정할 필요가 없습니다.
  • 성능상의 이유로 높이를 캐시합니다.
  • 공통 함수를 사용하여 인덱스 경로의 셀 식별자를 가져와 로직 중복을 방지합니다.

앤서봇, 브레넌, 렌소벳 덕분이야

- (NSString *)cellIdentifierForIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = nil;

    switch (indexPath.section)
    {
        case 0:
            cellIdentifier = @"ArtworkCell";
            break;
         <... and so on ...>
    }

    return cellIdentifier;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = [self cellIdentifierForIndexPath:indexPath];
    static NSMutableDictionary *heightCache;
    if (!heightCache)
        heightCache = [[NSMutableDictionary alloc] init];
    NSNumber *cachedHeight = heightCache[cellIdentifier];
    if (cachedHeight)
        return cachedHeight.floatValue;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    CGFloat height = cell.bounds.size.height;
    heightCache[cellIdentifier] = @(height);
    return height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = [self cellIdentifierForIndexPath:indexPath];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    <... configure cell as usual...>

실제로 행 높이로 변경해야 하는 곳이 두 곳 있습니다. 먼저 셀(이미 변경)과 이제 테이블 보기를 선택하고 크기 검사기를 확인합니다.

벌레인 것 같아요.

유틸리티 인스펙터가 아닌 마우스를 직접 스토리보드에 드래그하여 높이를 조정해 봅니다.

나는 이 방법으로 이 문제를 해결했다.

만약 swift를 사용한다면, 이렇게 사용하세요.스토리보드를 사용하여 행 높이를 선택하지 마십시오.이렇게 프로그래밍 방식으로 테이블 열 높이를 설정합니다.

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.row == 0 || indexPath.row == 1{
        let cell = self.tableView.dequeueReusableCellWithIdentifier("section1", forIndexPath: indexPath) as! Section1TableViewCell
        self.tableView.rowHeight = 150
        cell.label1.text = "hiiiiii"
        cell.label2.text = "Huiiilllllll"
        return cell

    } else {

        let cell = self.tableView.dequeueReusableCellWithIdentifier("section2", forIndexPath: indexPath) as! Section2TableViewCell
        self.tableView.rowHeight = 60
        cell.label3.text = "llll"
        return cell
    }

}

스토리보드에서 UITableviewCell(UITableviewController - 정적 셀)의 높이를 다음 행으로 확인할 수 있습니다.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   CGFloat height = [super tableView:tableView heightForRowAtIndexPath:indexPath];

    return height;
}

를 열고 합니다.rowHeight원하는 요소의 속성입니다.

프로토타입 행의 사용자 지정 rowHeight를 설정하려고 했을 때 효과가 있었습니다.인스펙터에서는 동작하지 않지만 XML에서는 동작합니다.

원형을 .cellsheight , , , , , , 를 .cellForRowAtIndexPath:frame.height

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self tableView:tableView
                    cellForRowAtIndexPath:indexPath];
    return cell.frame.size.height;
}

정적 행 높이를 설정하려면 다음과 같이 할 수 있습니다.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 120;
}

하다는 위에 입니다.heightForRowAtIndexPath: 7. 81로 만으로 결과를 .

자가 크기 조정 세포에 대해 자세히 알아보기 시작했습니다(iOS 8에서 소개됨, 여기서 읽음).의 사용이 명백했다.UITableViewAutomaticDimension이 기술을 8의 했습니다. 저는 그 기술을 사용해봤지만heightForRowAtIndexPath: voila하고 있었습니다.iOS 8 os os os os 。iOS 7 은os은은은 。가가 뭘? ???는 ★★★★★★★★★★★★가 필요했다.heightForRowAtIndexPath: 8iOS 8이 입니다.

위에 게재된 @JosephH의 답변에서 차용한 솔루션(간단히 하기 위해 개발된 솔루션)을 다음에 나타냅니다.

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.estimatedRowHeight = 50.;
    self.tableView.rowHeight = UITableViewAutomaticDimension;

    // ...
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
        return UITableViewAutomaticDimension;

    } else {
        NSString *cellIdentifier = [self reuseIdentifierForCellAtIndexPath:indexPath];
        static NSMutableDictionary *heightCache;
        if (!heightCache)
            heightCache = [[NSMutableDictionary alloc] init];
        NSNumber *cachedHeight = heightCache[cellIdentifier];
        if (cachedHeight)
            return cachedHeight.floatValue;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    CGFloat height = cell.bounds.size.height;
    heightCache[cellIdentifier] = @(height);
    return height;
    }
}

- (NSString *)reuseIdentifierForCellAtIndexPath:(NSIndexPath *)indexPath {
    NSString * reuseIdentifier;
    switch (indexPath.row) {
        case 0:
            reuseIdentifier = EventTitleCellIdentifier;
            break;
        case 2:
            reuseIdentifier = EventDateTimeCellIdentifier;
            break;
        case 4:
            reuseIdentifier = EventContactsCellIdentifier;
            break;
        case 6:
            reuseIdentifier = EventLocationCellIdentifier;
            break;
        case 8:
            reuseIdentifier = NotesCellIdentifier;
            break;
        default:
            reuseIdentifier = SeparatorCellIdentifier;
            break;
    }

    return reuseIdentifier;
}

SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")는 실제로 사용하고 있는 매크로 정의의 집합에서 얻은 것입니다(매우 도움이 됩니다).다음과 같이 정의됩니다.

#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

Swift 4를 사용하여 XCode 9에서 작업할 때도 같은 문제가 발생하였습니다.

내부의 UI 요소에 대해 AutoLayout을 추가하면 지정된 대로 사용자 지정 셀 행 높이가 작동합니다.

동적 셀의 경우 UETableView에서 설정된 rowHeight는 항상 개별 셀의 rowHeight보다 우선됩니다.행에 포함된 내용일 경우 동적 높이를 계산합니다.

내가 찾을 수 있는 유일한 해결책은

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = ...; // Instantiate with a "common" method you'll use again in cellForRowAtIndexPath:
    return cell.frame.size.height;
}

StoryBoard에 이미 있는 논리가 중복되어 있는 경우, 이 조작은 동작하며, 스위치 상태가 나빠지지 않습니다.퍼포먼스는 잘 모르겠지만 아마 도착해서cellForRow:세포는 이미 초기화되고 있고 그만큼 빨라요물론 여기에는 부수적인 피해가 있겠지만, 여기서는 잘 되는 것 같습니다.

여기에도 글을 올렸습니다.https://devforums.apple.com/message/772464

편집: Ortwin Gentz가 상기시켜 주었습니다.heightForRowAtIndexPath:표시되는 셀뿐만 아니라 TableView의 모든 셀에 대해 호출됩니다.iOS가 올바른 스크롤 바를 표시하기 위해서는 총 높이를 알아야 하므로 논리적으로 들릴 수 있습니다.즉, 작은 TableView(20셀 등)에서는 문제가 없지만 1000셀 TableView에서는 문제가 없습니다.

또한 XML을 사용한 이전 트릭은 첫 번째 코멘트와 동일합니다.올바른 값이 이미 있었습니다.

댓글로 추가되지만 가시성을 위해 답변으로 게시:

테이블 뷰를 처음에 "정적 셀"로 설정한 다음 "동적 프로토타입"으로 변경하는 경우에도 문제가 있을 수 있습니다.대리자 방식조차 문제가 있었습니다.heightForRowAtIndexPath무시당했습니다.스토리보드 XML을 직접 편집하여 문제를 해결한 후, 처음부터 동적 프로토타입을 사용하여 스토리보드 장면을 처음부터 다시 만들었습니다.

Interface Builder를 통해 이 문제에 대한 해결책을 찾지 못했기 때문에 첫 번째 질문에서 Interface Builder를 통해 해결책을 묻는 질문이었지만 2개의 동적 셀을 사용하여 Swift에 문제에 대한 프로그래밍 솔루션을 게시하기로 결정했습니다.그래도 Stack Overflow 커뮤니티에는 도움이 될 것 같습니다.

    import UIKit

    enum SignInUpMenuTableViewControllerCellIdentifier: String {
       case BigButtonCell = "BigButtonCell"
       case LabelCell = "LabelCell"
    }

    class SignInUpMenuTableViewController: UITableViewController {
            let heightCache = [SignInUpMenuTableViewControllerCellIdentifier.BigButtonCell : CGFloat(50),
                              SignInUpMenuTableViewControllerCellIdentifier.LabelCell : CGFloat(115)]

    private func cellIdentifierForIndexPath(indexPath: NSIndexPath) -> SignInUpMenuTableViewControllerCellIdentifier {
        if indexPath.row == 2 {
            return SignInUpMenuTableViewControllerCellIdentifier.LabelCell
        } else {
            return SignInUpMenuTableViewControllerCellIdentifier.BigButtonCell
        }
    }

   override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
       return self.heightCache[self.cellIdentifierForIndexPath(indexPath)]!
   }

   ...

  }

문서 개요로 이동하여 프로토타입 셀이 중첩된 표 보기를 선택하는 것도 가능합니다.그런 다음 Size Inspector에서 테이블 뷰의 행 높이를 원하는 값으로 변경하고 Automatic 상자를 선택 취소합니다.

언급URL : https://stackoverflow.com/questions/8615862/custom-cell-row-height-setting-in-storyboard-is-not-responding

반응형