UITable View Cell의 동적 높이 문제(Swift)
테이블뷰 셀 레이블에 가변 길이의 텍스트 데이터를 주입하고 있습니다.의 셀 크기가 될 수 , 는 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ viewDidLoad()
:
self.tableView.estimatedRowHeight = 88.0
self.tableView.rowHeight = UITableViewAutomaticDimension
이렇게 하면 높이가 88.0픽셀이 될 것으로 예상되며 크기가 클 경우 자동으로 크기를 조정해야 합니다.아직 스크롤되지 않은 셀에 대해 완벽하게 작동합니다.UITableViewAutomaticDimention
셀)로 스크롤할 때 호출되지만 테이블에 데이터를 로드할 때 화면에 처음 렌더링되는 셀의 경우에는 호출되지 않습니다.
다른 여러 리소스에서 제안한 대로 데이터를 다시 로드하려고 했습니다.
self.tableView.reloadData()
둘 다viewDidAppear()
그리고.viewWillAppear()
도움이 되지 않았습니다.길을 잃었습니다..화면에 처음 로드된 셀의 동적 높이를 렌더링하는 방법을 아는 사람이 있습니까?
시도해 보기:
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
편집
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
스위프트 4
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
스위프트 4.2
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
위의 두 가지 방법을 모두 정의합니다.
그것이 문제를 해결해 줍니다.
PS: 이것이 작동하기 위해서는 상하 제약 조건이 필요합니다.
사용 방법:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 300
않음: 하지 :heightForRowAtIndexPath
기능
또한 스토리보드에서 많은 양의 데이터가 포함된 레이블의 높이를 설정하지 마십시오.요top, bottom, leading, trailing
제약.
스위프트 3
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 160
AND!!! In StoryBoard: 레이블에 대해 상단 및 하단 제약 조건을 설정해야 합니다.다른 것은 없어요.
이 이상한 버그는 다른 답변이 문제를 해결하지 못했기 때문에 Interface Builder 매개 변수를 통해 해결되었습니다.
가 한 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔestimatedRowHeight
의 기본 행를 [ Interface Builder] 및 [ Interface Builder]로 설정했습니다.88px
콘트롤러에 했습니다.viewDidLoad()
:
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 88.0
하지만 그것은 효과가 없었습니다.그래서 저는 콘텐츠가 어쩌면 더 커질지도 모른다는 것을 깨달았습니다.100px
, 그래서 기본 셀 높이를 다음과 같이 설정했습니다.108px
(잠재적인 내용보다 중요) 컨트롤러에 그렇게 반영하였습니다.viewDidLoad()
:
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 108.0
이를 통해 코드는 초기 레이블을 올바른 크기로 축소할 수 있었습니다.다시 말해, 더 큰 크기로 확장된 적은 없지만, 항상 축소될 수 있습니다.또한, 추가적인self.tableView.reloadData()
에 했습니다.viewWillAppear()
.
이것이 매우 가변적인 콘텐츠 크기를 포함하지 않는다는 것을 알고 있지만, 이것은 콘텐츠가 최대 가능한 문자 수를 가진 내 상황에서 작동했습니다.
이것이 스위프트의 버그인지 인터페이스 빌더의 버그인지 확실하지 않지만 매력적으로 작동합니다.한 번 해보세요!
행 높이 및 예상 행 높이에 대한 자동 치수를 설정하고 다음 단계를 수행합니다.
@IBOutlet weak var table: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Set automatic dimensions for row height
// Swift 4.2 onwards
table.rowHeight = UITableView.automaticDimension
table.estimatedRowHeight = UITableView.automaticDimension
// Swift 4.1 and below
table.rowHeight = UITableViewAutomaticDimension
table.estimatedRowHeight = UITableViewAutomaticDimension
}
// UITableViewAutomaticDimension calculates height of label contents/text
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// Swift 4.2 onwards
return UITableView.automaticDimension
// Swift 4.1 and below
return UITableViewAutomaticDimension
}
예를 들어, UITableviewCell에 레이블이 있는 경우,
- 선 개수 설정 = 0 (& 선 끊기 모드 = 꼬리 자르기)
- 수퍼뷰/셀 용기에 대한 모든 제약 조건(상, 하, 우측 좌측)을 설정합니다.
- 옵션:데이터가 없더라도 레이블에서 다루는 최소 수직 영역을 원하는 경우 레이블의 최소 높이를 설정합니다.
다음은 동적 높이 제약 조건이 있는 표본 레이블입니다.
Swift 3의 경우 다음을 사용할 수 있습니다.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
UITableView의 동적 사이징 셀에 필요한 2가지 사항
- 테이블 뷰 셀 내부에서 뷰의 올바른 제약 조건 설정(대부분 뷰에 적절한 상단, 하단 및 후행 제약 조건 제공)
보기 DidLoad()에서 TableView의 이러한 속성 호출
tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 140
swift 3으로 작성된 셀프사이징(dynamic table view cells)에 대한 멋진 튜토리얼입니다.
저의 경우 - 스토리보드에서 저는 아래 이미지와 같이 두 개의 라벨을 가지고 있었습니다. 두 라벨 모두 동일하게 만들기 전에 원하는 너비 값을 설정하고 있었습니다. 선택을 해제하면 자동으로 바뀌며, 평소처럼 아래의 것들이 매력처럼 작동해야 합니다.
1.rowHeight = UITableView.automaticDimension, and
2.estimatedRowHeight = 100(In my case).
3.make sure label number of lines is zero.
다른 사람들이 말한 것 외에,
레이블의 제약 조건을 수퍼뷰와 비교하여 설정합니다!
따라서 레이블의 제약 조건을 주변의 다른 항목에 상대적으로 배치하는 대신 테이블 보기 셀의 내용 보기로 제약합니다.
그런 다음 레이블의 높이가 0보다 크거나 같게 설정되고 선의 수가 0으로 설정되었는지 확인합니다.
에서ViewDidLoad
선택사항:
tableView.estimatedRowHeight = 695
tableView.rowHeight = UITableViewAutomaticDimension
UITableViewCell의 크기를 자동으로 조정하여 작동하려면 다음과 같이 변경해야 합니다.
- 스토리보드에서 UITable View에는 동적 프로토타입 셀만 포함되어야 합니다(정적 셀을 사용해서는 안 됩니다). 그렇지 않으면 자동 크기 조정이 작동하지 않습니다.
- 스토리보드에서 UITableViewCell의 UILabel은 상단, 하단, 선행 및 후행 제약의 4가지 제약 조건에 대해 모두 구성했습니다.
- 스토리보드에서 UITableViewCell의 UILabel의 행 수는 0이어야 합니다.
UIViewController의 ViewDidLoad 함수가 UITableView Properties 아래에 설정된 경우:
self.tableView.estimatedRowHeight = <minimum cell height> self.tableView.rowHeight = UITableViewAutomaticDimension
Swift의 경우 iOS 9.0과 iOS 11에서도 이 답변을 확인하였습니다(Xcode 9.3).
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
여기에 상하좌우 제약 조건을 추가해야 합니다.
스위프트 4.2용
@IBOutlet weak var tableVw: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Set self as tableView delegate
tableVw.delegate = self
tableVw.rowHeight = UITableView.automaticDimension
tableVw.estimatedRowHeight = UITableView.automaticDimension
}
// UITableViewDelegate Method
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
해피코딩 :)
이는 두 가지 작업을 수행할 때 간단합니다.
- 자동 높이 설정
tableView.rowHeight = UITableView.automaticDimension
- 위에서 아래로 제약 조건이 꽉 찬 모든 테이블 보기 셀을 만듭니다.마지막 요소는 셀을 종료하기 위한 하단 간격을 정의해야 합니다.
따라서 레이아웃 엔진은 셀 높이를 계산하고 값을 정확하게 적용할 수 있습니다.
유감스럽게도 제가 무엇을 놓쳤는지 잘 모르겠습니다.위의 방법들은 제가 xib 셀의 높이를 얻거나 필요한 경우 레이아웃() 또는 UITableView를 허용하는 데에는 도움이 되지 않습니다.자동 치수(Automatic Dimension)로 높이 계산을 수행합니다.3~4박 동안 검색하고 노력했지만 답을 찾지 못했습니다.여기 또는 다른 게시물에 대한 답변이 해결 방법에 대한 힌트를 주었습니다.바보 같은 방법이지만 효과가 있습니다.모든 셀을 배열에 추가하기만 하면 됩니다.그런 다음 xib 스토리보드에서 각 키 제한의 출구를 설정합니다.마지막으로 highForRowAt 메서드에서 추가합니다.만약 당신이 그 API들에 익숙하지 않다면 그것은 간단합니다.
스위프트 4.2
CustomCell.Swift
@IBOutlet weak var textViewOneHeight: NSLayoutConstraint!
@IBOutlet weak var textViewTwoHeight: NSLayoutConstraint!
@IBOutlet weak var textViewThreeHeight: NSLayoutConstraint!
@IBOutlet weak var textViewFourHeight: NSLayoutConstraint!
@IBOutlet weak var textViewFiveHeight: NSLayoutConstraint!
내 테이블 보기VC.Swift
.
.
var myCustomCells:[CustomCell] = []
.
.
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = Bundle.main.loadNibNamed("CustomCell", owner: self, options: nil)?.first as! CustomCell
.
.
myCustomCells.append(cell)
return cell
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
let totalHeight = myCustomCells[indexPath.row].textViewOneHeight.constant + myCustomCells[indexPath.row].textViewTwoHeight.constant + myCustomCells[indexPath.row].textViewThreeHeight.constant + myCustomCells[indexPath.row].textViewFourHeight.constant + myCustomCells[indexPath.row].textViewFiveHeight.constant
return totalHeight + 40 //some magic number
}
나는 이것들을 사용합니다.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 100
}
해라
override func viewWillAppear(animated: Bool) {
self.tableView.layoutSubviews()
}
저도 같은 문제가 있었는데 저한테 효과가 있어요.
셀 뷰/뷰의 각 객체에 대해 TOP, BTOM, HIGH에 대한 모든 제약 조건을 설정하고 존재하는 중간 Y 위치를 제거해야 합니다.그렇지 않은 곳에서는 다른 뷰에 아티팩트가 표시되기 때문입니다.
목적 c를 위해 이것은 나의 좋은 해결책 중 하나입니다.저한테 효과가 있어요
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
cell.textLabel.text = [_nameArray objectAtIndex:indexPath.row];
cell.textLabel.numberOfLines = 0;
cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewAutomaticDimension;
}
우리는 이 두 가지 변화를 적용해야 합니다.
1)cell.textLabel.numberOfLines = 0;
cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
2)return UITableViewAutomaticDimension;
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 88.0
레이블에 대한 하단 제약 조건을 추가하는 것도 잊지 마십시오.
나는 당신의 해결책에 영감을 받고 다른 방법을 시도했을 뿐입니다.
추가를 시도해 보십시오.tableView.reloadData()
viewDidAppear()
.
저는 이 정도면 돼요.
스크롤 뒤에 있는 것들은 reloadData와 "동일"하다고 생각합니다. 때는 마치 ㅇㅇㅇㅇㅇㅇㅇㅇㅇ을 부르는 것과 .reloadData()
viewDidAppear
.
만약 이것이 효과가 있다면, 제가 이 해결책을 확신할 수 있도록 답변 부탁드립니다.
저도 처음에 이 문제를 겪었습니다. 이 코드에서 문제를 해결하여 사용을 피했습니다.self.tableView.reloadData()
에 대한 이 코드 한이드신적신드d이rc에
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
을 할 할 사용 시UITableView
을 , 했습니다 을 에 설정합니다.UILabel
s와 calltableView.reloadData()
.
실행 시간에 설정한 사용자 정의 셀에 높이 제한을 설정하는 것이 효과적이었습니다(각 셀에 확장/축소 버튼이 있음).
그런 다음 부모의 highForRowAt에서 제안된 답변의 조합을 수행해야 했습니다.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if let cell = tableView.cellForRow(at: indexPath) as? GroupTableViewCell {
return cell.heightConstraint.constant
}
return UITableView.automaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 88.0
}
나는 이미 계산된 높이 구속 상수를 사용할 수 있는 곳과 UITableView를 사용합니다.자동 치수(Automatic Dimension). 그렇지 않을 경우이것은 세포가 재활용될 때 정확한 높이를 얻고 정확한 세포 상태를 유지할 수 있는 유일한 방법이었습니다.
셀 자체를 높이 ForRowAt 내부에서 참조하는 것은 나쁜 관행으로 간주된다고 들었습니다만, 모든 제약 조건을 만족시키면서 동적 높이를 가진 맞춤형 셀 객체로 수행할 수 있는 다른 방법은 없습니다.
self.Itemtableview.estimatedRowHeight = 0;
self.Itemtableview.estimatedSectionHeaderHeight = 0;
self.Itemtableview.estimatedSectionFooterHeight = 0;
[ self.Itemtableview reloadData];
self.Itemtableview.frame = CGRectMake( self.Itemtableview.frame.origin.x, self.Itemtableview.frame.origin.y, self.Itemtableview.frame.size.width,self.Itemtableview.contentSize.height + self.Itemtableview.contentInset.bottom + self.Itemtableview.contentInset.top);
적절한 제약 조건 및 대리인 업데이트 방법을 다음과 같이 설정합니다.
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
그러면 동적 셀 높이 문제가 해결됩니다.그렇지 않다면 제약 조건을 확인해야 합니다.
스위프트 5 엔조이
tablev.rowHeight = 100
tablev.estimatedRowHeight = UITableView.automaticDimension
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = self.tablev.dequeueReusableCell(withIdentifier: "ConferenceRoomsCell") as! ConferenceRoomsCell
cell.lblRoomName.numberOfLines = 0
cell.lblRoomName.lineBreakMode = .byWordWrapping
cell.lblRoomName.text = arrNameOfRooms[indexPath.row]
cell.lblRoomName.sizeToFit()
return cell
}
언급URL : https://stackoverflow.com/questions/30494702/dynamic-height-issue-for-uitableview-cells-swift
'programing' 카테고리의 다른 글
MySQL에서 MSSQL IDENTITY 열과 동등함 (0) | 2023.09.16 |
---|---|
CORS(Cross-Origin Resource Sharing) 개념 (0) | 2023.09.16 |
Python and Django Operational Error (2006, 'MySQL 서버가 사라졌습니다') (0) | 2023.09.16 |
어떻게 하면 HTML과 CSS로 div 콘텐츠를 한 줄로 유지할 수 있습니까? (0) | 2023.09.16 |
to_sql을 사용하여 팬더 데이터프레임을 오라클 데이터베이스에 쓰는 방법? (0) | 2023.09.16 |