스토리보드의 사용자 지정 셀 행 높이 설정이 응답하지 않습니다.
테이블 뷰에 있는 셀 중 하나의 셀 높이를 조정하려고 합니다.해당 셀의 "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에서는 동작합니다.
원형을 .cells
height
, , , , , , 를 .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
'programing' 카테고리의 다른 글
숫자 열을 합산하는 Bash 명령어 (0) | 2023.04.11 |
---|---|
공식에서 셀의 값을 셀 참조로 사용하는가? (0) | 2023.04.11 |
WPF에서는 Binding과 마찬가지로 TemplateBinding이 동작하지 않는 이유는 무엇입니까? (0) | 2023.04.11 |
SQL Server에서 특정 테이블에 대한 CREATE TABLE 문을 생성하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
패스워드 없이 다른 사용자로 스크립트를 실행하는 방법 (0) | 2023.04.11 |