diff --git a/DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift b/DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift index c09e0ebf..97512237 100644 --- a/DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift +++ b/DE/DE/Sources/Core/CommonUI/Cells/ReviewCollectionViewCell.swift @@ -10,6 +10,8 @@ public class ReviewCollectionViewCell: UICollectionViewCell { public static let identifier = "ReviewCollectionViewCell" var isExpanded = false + private var toggleBottomConstraint: Constraint? + private var reviewBottomConstraint: Constraint? public var onToggle: (() -> Void)? public lazy var nickname = UILabel().then { @@ -30,6 +32,7 @@ public class ReviewCollectionViewCell: UICollectionViewCell { $0.setTitle("더보기", for: .normal) $0.titleLabel?.font = UIFont.pretendard(.medium, size: 13) $0.setTitleColor(AppColor.gray70, for: .normal) + $0.contentHorizontalAlignment = .left $0.isHidden = true } @@ -62,7 +65,7 @@ public class ReviewCollectionViewCell: UICollectionViewCell { private func constraints() { nickname.snp.makeConstraints { $0.top.equalToSuperview().offset(12) - $0.leading.equalToSuperview().offset(16) + $0.leading.equalToSuperview().offset(17) } score.snp.makeConstraints { @@ -71,18 +74,21 @@ public class ReviewCollectionViewCell: UICollectionViewCell { } review.snp.makeConstraints { - $0.horizontalEdges.equalToSuperview().inset(16) + $0.horizontalEdges.equalToSuperview().inset(17) $0.top.equalTo(nickname.snp.bottom).offset(7) + self.reviewBottomConstraint = $0.bottom.equalToSuperview().offset(-12).constraint } date.snp.makeConstraints { $0.centerY.equalTo(score) - $0.trailing.equalToSuperview().offset(-16) + $0.trailing.equalToSuperview().offset(-17) } toggleButton.snp.makeConstraints { $0.top.equalTo(review.snp.bottom).offset(2) $0.leading.equalTo(review.snp.leading) + $0.bottom.equalToSuperview().offset(-10) + self.toggleBottomConstraint = $0.bottom.equalToSuperview().offset(-12).constraint } } @@ -99,7 +105,17 @@ public class ReviewCollectionViewCell: UICollectionViewCell { self.isExpanded = isExpanded review.numberOfLines = isExpanded ? 0 : 2 toggleButton.setTitle(isExpanded ? "접기" : "더보기", for: .normal) - toggleButton.isHidden = !isReviewTextTruncated() + let shouldShowToggle = isReviewTextTruncated() + toggleButton.isHidden = !shouldShowToggle + + // 리뷰내 2줄 초과인지 아닌지에 따른 제약 활성화/비활성화 + if shouldShowToggle { + toggleBottomConstraint?.activate() + reviewBottomConstraint?.deactivate() + } else { + toggleBottomConstraint?.deactivate() + reviewBottomConstraint?.activate() + } } private func isReviewTextTruncated() -> Bool { diff --git a/DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift b/DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift index 0667edbb..956aabdb 100644 --- a/DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift +++ b/DE/DE/Sources/Features/Search/ViewControllers/EntireReviewViewController.swift @@ -201,18 +201,27 @@ extension EntireReviewViewController: UICollectionViewDataSource, UICollectionVi let text = reviewResults[indexPath.item].contents let isExpanded = expandedCells[indexPath.item] - // 텍스트 높이 계산 + 패딩 let labelFont = UIFont.pretendard(.medium, size: 14) let lineSpacing = labelFont.pointSize * 0.3 let labelWidth = width - 30 - //let estimatedHeight = text.heightWithConstrainedWidth(width: labelWidth, font: labelFont) - let numberOfLines = text.numberOfLines(width: labelWidth, font: labelFont, lineSpacing: lineSpacing) let lineHeight = labelFont.lineHeight + lineSpacing - let cellHeight = isExpanded - ? CGFloat(numberOfLines - 2) * lineHeight + 104 - : 104 - return CGSize(width: width, height: cellHeight) + let numberOfLines = text.numberOfLines(width: labelWidth, font: labelFont, lineSpacing: lineSpacing) + let isTruncated = numberOfLines > 2 + + let baseHeight: CGFloat = 98 + let toggleButtonExtraHeight: CGFloat = 13 + 12 // spacing + button + bottom inset + + let height: CGFloat + if isExpanded { + // 전체 줄 다 보여줄 때 + height = CGFloat(numberOfLines) * lineHeight + (baseHeight - (2 * lineHeight)) + toggleButtonExtraHeight + } else { + // 접힌 상태. 줄 수가 2를 초과하면 toggleButton을 위한 여유 공간 확보 + height = baseHeight + (isTruncated ? toggleButtonExtraHeight : 0) + } + + return CGSize(width: width, height: height) } func scrollViewDidScroll(_ scrollView: UIScrollView) { diff --git a/DE/DE/Sources/Features/Search/ViewControllers/WineDetailViewController.swift b/DE/DE/Sources/Features/Search/ViewControllers/WineDetailViewController.swift index af25e16e..2a4c880c 100644 --- a/DE/DE/Sources/Features/Search/ViewControllers/WineDetailViewController.swift +++ b/DE/DE/Sources/Features/Search/ViewControllers/WineDetailViewController.swift @@ -312,7 +312,7 @@ class WineDetailViewController: UIViewController, UIScrollViewDelegate, Firebase reviewView.moreBtn.isHidden = true reviewView.reviewCollectionView.isHidden = true reviewView.reviewCollectionView.snp.updateConstraints { - $0.height.equalTo(0) // 높이를 0으로 설정 + $0.height.equalTo(0) } reviewView.scoreLabel.isHidden = true reviewView.noReviewLabel.isHidden = false @@ -322,6 +322,10 @@ class WineDetailViewController: UIViewController, UIScrollViewDelegate, Firebase reviewView.reviewCollectionView.isHidden = false reviewView.scoreLabel.isHidden = false reviewView.noReviewLabel.isHidden = true + reviewView.reviewCollectionView.snp.updateConstraints { + /// 하나의 리뷰를 100 높이로 기본 세팅 -> 무조건 332 높이 no : 추후 반응형으로 바꿔주긴 해야함 + $0.height.equalTo(32 + reviewData.count * 100) + } } } @@ -506,17 +510,26 @@ extension WineDetailViewController: UICollectionViewDataSource, UICollectionView let text = reviewData[indexPath.item].contents let isExpanded = expandedCells[indexPath.item] - // 텍스트 높이 계산 + 패딩 let labelFont = UIFont.pretendard(.medium, size: 14) let lineSpacing = labelFont.pointSize * 0.3 let labelWidth = width - 30 - //let estimatedHeight = text.heightWithConstrainedWidth(width: labelWidth, font: labelFont) - let numberOfLines = text.numberOfLines(width: labelWidth, font: labelFont, lineSpacing: lineSpacing) let lineHeight = labelFont.lineHeight + lineSpacing - let cellHeight = isExpanded - ? CGFloat(numberOfLines - 2) * lineHeight + 104 - : 104 - return CGSize(width: width, height: cellHeight) + let numberOfLines = text.numberOfLines(width: labelWidth, font: labelFont, lineSpacing: lineSpacing) + let isTruncated = numberOfLines > 2 + + let baseHeight: CGFloat = 98 + let toggleButtonExtraHeight: CGFloat = 13 + 12 // spacing + button + bottom inset + + let height: CGFloat + if isExpanded { + // 전체 줄 다 보여줄 때 + height = CGFloat(numberOfLines) * lineHeight + (baseHeight - (2 * lineHeight)) + toggleButtonExtraHeight + } else { + // 접힌 상태. 줄 수가 2를 초과하면 toggleButton을 위한 여유 공간 확보 + height = baseHeight + (isTruncated ? toggleButtonExtraHeight : 0) + } + + return CGSize(width: width, height: height) } } diff --git a/DE/DE/Sources/Features/TastingNote/ViewControllers/EditVCs/EditReviewViewController.swift b/DE/DE/Sources/Features/TastingNote/ViewControllers/EditVCs/EditReviewViewController.swift index 43610278..f547e510 100644 --- a/DE/DE/Sources/Features/TastingNote/ViewControllers/EditVCs/EditReviewViewController.swift +++ b/DE/DE/Sources/Features/TastingNote/ViewControllers/EditVCs/EditReviewViewController.swift @@ -105,8 +105,7 @@ public class EditReviewViewController: UIViewController, FirebaseTrackable { } else { reviewString = rView.reviewBody.text ?? "" } - let reviewDate = "2026-13-13" - let updateData = networkService.makeUpdateNoteBodyDTO(tastingDate: reviewDate, review: reviewString) + let updateData = networkService.makeUpdateNoteBodyDTO(review: reviewString) // let updateData = networkService.makeUpdateNoteBodyDTO(review: reviewString) let tnData = networkService.makeUpdateNoteDTO(noteId: tnManager.noteId, body: updateData)