final class CouponCell: BaseCollectionViewCell<CellModel> {
lazy var containerView = TouchableView()
private lazy var contentContainerView = UIView()
private lazy var stateContainerView = UIView()
private lazy var couponImageView = UIImageView()
private lazy var couponNameLabel = UILabel().then({
$0.textColor = ColorManager.gray9.color
let attributedText = FontManager.body4M.setFont(alignment: .left)
$0.attributedText = attributedText
})
private lazy var dateLabel = PaddedLabel(padding: .init(top: moderateScale(number: 2),
left: moderateScale(number: 6),
bottom: moderateScale(number: 2),
right: moderateScale(number: 6))).then {
$0.textColor = ColorManager.gray9.color
$0.font = FontManager.lable2R.font
$0.textAlignment = .center
$0.layer.cornerRadius = moderateScale(number: 6)
$0.layer.masksToBounds = true
}
private lazy var benefitFigureLabel = UILabel().then({
$0.textColor = ColorManager.gray9.color
let attributedText = FontManager.title3B.setFont(alignment: .center)
$0.attributedText = attributedText
})
private lazy var benefitContentLabel = UILabel().then({
$0.textColor = ColorManager.gray6.color
let attributedText = FontManager.lable1M.setFont(alignment: .left)
$0.attributedText = attributedText
})
private lazy var benefitStartDateLabel = UILabel().then({
$0.textColor = ColorManager.gray6.color
let attributedText = FontManager.lable1R.setFont(alignment: .left)
$0.attributedText = attributedText
})
private lazy var benefitEndDateLabel = UILabel().then({
$0.textColor = ColorManager.gray6.color
let attributedText = FontManager.lable1R.setFont(alignment: .left)
$0.attributedText = attributedText
})
lazy var showDetailTouchableLabel = TouchableLabel().then({
let attributedText = FontManager.body3M.setFont(alignment: .center)
$0.attributedText = attributedText
$0.textColor = ColorManager.gray6.color
$0.setUnderLine(color: ColorManager.gray6.color)
$0.text = StaticValues.getTranslation(of: "transfer_history.etc.payment_receipt_detail")
})
lazy var couponStateImageView = TouchableImageView(frame: .zero)
override init(frame: CGRect) {
super.init(frame: frame)
addViews()
makeConstraints()
contentContainerView.layoutIfNeeded()
contentContainerView.roundCorners(leftTop: 16, rightTop: 8, leftBottom: 16, rightBottom: 8)
if let shapeLayer = contentContainerView.layer.mask as? CAShapeLayer,
let path = shapeLayer.path {
let borderLayer = CAShapeLayer()
borderLayer.path = path // Reuse the Bezier path
borderLayer.strokeColor = ColorManager.gray3_5.color?.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.lineWidth = moderateScale(number: 2)
borderLayer.frame = contentContainerView.bounds
contentContainerView.layer.addSublayer(borderLayer)
} else {
print("Error: Could not cast layer.mask to CAShapeLayer or retrieve the path.")
}
stateContainerView.layoutIfNeeded()
stateContainerView.roundCorners(leftTop: 8, rightTop: 16, leftBottom: 8, rightBottom: 16)
if let shapeLayer = stateContainerView.layer.mask as? CAShapeLayer,
let path = shapeLayer.path {
let borderLayer = CAShapeLayer()
borderLayer.path = path
borderLayer.strokeColor = ColorManager.gray3_5.color?.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.lineWidth = moderateScale(number: 2)
borderLayer.frame = stateContainerView.bounds
stateContainerView.layer.addSublayer(borderLayer)
} else {
print("Error: Could not cast layer.mask to CAShapeLayer or retrieve the path.")
}
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func addViews() {
addSubview(containerView)
containerView.addSubviews([contentContainerView,
stateContainerView])
contentContainerView.addSubviews([couponImageView,
couponNameLabel,
dateLabel,
benefitFigureLabel,
benefitContentLabel,
benefitStartDateLabel,
benefitEndDateLabel,
showDetailTouchableLabel])
stateContainerView.addSubview(couponStateImageView)
}
private func makeConstraints() {
containerView.snp.makeConstraints {
$0.top.bottom.equalToSuperview()
$0.leading.trailing.equalToSuperview().inset(moderateScale(number: 20))
}
contentContainerView.snp.makeConstraints {
$0.top.leading.bottom.equalToSuperview()
$0.trailing.equalTo(stateContainerView.snp.leading).offset(moderateScale(number: 1))
}
stateContainerView.snp.makeConstraints {
$0.top.bottom.trailing.equalToSuperview()
$0.width.equalTo(moderateScale(number: moderateScale(number: 48)))
}
couponImageView.snp.makeConstraints {
$0.centerY.equalToSuperview()
$0.leading.equalToSuperview().inset(moderateScale(number: 12))
$0.size.equalTo(moderateScale(number: 48))
}
couponNameLabel.snp.makeConstraints {
$0.leading.equalTo(couponImageView.snp.trailing).offset(moderateScale(number: 8))
$0.top.equalToSuperview().inset(moderateScale(number: 15))
}
dateLabel.snp.makeConstraints {
$0.top.equalToSuperview().inset(moderateScale(number: 14))
$0.trailing.equalToSuperview().inset(moderateScale(number: 15))
}
benefitFigureLabel.snp.makeConstraints {
$0.leading.equalTo(couponNameLabel)
$0.top.equalTo(couponNameLabel.snp.bottom).offset(moderateScale(number: 1))
}
benefitContentLabel.snp.makeConstraints {
$0.leading.equalTo(couponNameLabel)
$0.top.equalTo(benefitFigureLabel.snp.bottom).offset(moderateScale(number: 4))
}
benefitStartDateLabel.snp.makeConstraints {
$0.leading.equalTo(couponNameLabel)
$0.top.equalTo(benefitContentLabel.snp.bottom).offset(moderateScale(number: 2))
$0.bottom.equalToSuperview().inset(moderateScale(number: 14))
}
benefitEndDateLabel.snp.makeConstraints {
$0.leading.equalTo(benefitStartDateLabel.snp.trailing)
$0.centerY.equalTo(benefitStartDateLabel)
}
showDetailTouchableLabel.snp.makeConstraints {
$0.bottom.equalTo(benefitStartDateLabel.snp.bottom)
$0.trailing.equalToSuperview().offset(moderateScale(number: -16))
}
couponStateImageView.snp.makeConstraints {
$0.center.equalToSuperview()
$0.size.equalTo(moderateScale(number: 24))
}
}
override func bind(_ model: CellModel) {
guard let couponModel = model as? CouponCellModel else { return }
configureUI(for: couponModel)
configureBorderLayer(for: stateContainerView, isSelected: (couponModel as? SelectableCouponCellModel)?.isSelected ?? false)
configureBorderLayer(for: contentContainerView, isSelected: (couponModel as? SelectableCouponCellModel)?.isSelected ?? false)
}
private func configureUI(for model: CouponCellModel) {
couponImageView.setImage(withBase64String: model.image)
couponNameLabel.text = StaticValues.getTranslation(of: model.nameStringkey)
benefitFigureLabel.text = StaticValues.getTranslation(of: model.benefitFigureStringkey)
benefitContentLabel.text = StaticValues.getTranslation(of: model.benefitContentStringkey)
if model.benefitEndDate.expireDate() == "0" {
dateLabel.text = StaticValues.getTranslation(of: "coupon.etc.expired_today")
dateLabel.textColor = ColorManager.red5.color
dateLabel.backgroundColor = ColorManager.red0.color
} else {
if model.benefitEndDate.toDate(with: "yyyy-MM-dd HH:mm:ss")?.withinSevenDay() == true {
dateLabel.textColor = ColorManager.orange5.color
dateLabel.backgroundColor = ColorManager.orange0.color
} else {
dateLabel.textColor = ColorManager.gray6.color
dateLabel.backgroundColor = ColorManager.gray1.color
}
dateLabel.text = "D-" + model.benefitEndDate.expireDate()
}
let startDateString = model.benefitStartDate.toDate(with: "yyyy-MM-dd HH:mm:ss")?.dateToString(with: "MM/dd/yyyy") ?? ""
benefitStartDateLabel.text = startDateString
let endDateString = model.benefitEndDate.toDate(with: "yyyy-MM-dd HH:mm:ss")?.dateToString(with: "MM/dd/yyyy") ?? ""
benefitEndDateLabel.text = " ~ " + endDateString
if let selectableModel = model as? SelectableCouponCellModel {
couponStateImageView.image = selectableModel.isSelected ? UIImage(named: "CheckIcon") : UIImage(named: "NoCheckIcon")
contentContainerView.backgroundColor = selectableModel.isSelected ? ColorManager.primaryBg.color: ColorManager.white.color
stateContainerView.backgroundColor = selectableModel.isSelected ? ColorManager.primaryBg.color: ColorManager.white.color
} else {
stateContainerView.backgroundColor = ColorManager.white.color
contentContainerView.backgroundColor = ColorManager.white.color
couponStateImageView.image = UIImage(named: "Download")
couponStateImageView.tintColor = ColorManager.gray8.color
}
}
private func configureBorderLayer(for containerView: UIView, isSelected: Bool) {
guard let shapeLayer = containerView.layer.mask as? CAShapeLayer, let path = shapeLayer.path else {
print("Error: Could not cast layer.mask to CAShapeLayer or retrieve the path.")
return
}
let borderLayer = CAShapeLayer()
borderLayer.path = path
borderLayer.strokeColor = isSelected ? ColorManager.primary5.color?.cgColor : ColorManager.gray3_5.color?.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
borderLayer.lineWidth = moderateScale(number: 2)
borderLayer.frame = containerView.bounds
containerView.layer.addSublayer(borderLayer)
}
}
기존에는 makeConstraints 내에서 layoutifneeded()를 호출해서 셀의 크기가 조금씩 변하는 현상 발생
addviews, makeConstrinats완료 후 layoutIfNeeded()를 호출했더니 해당 현상이 수정
'끄적끄적' 카테고리의 다른 글
firebase 디버깅 이슈 (1) | 2024.02.22 |
---|---|
[끄적끄적] 순환 참조 발생 부분 (2) | 2024.02.07 |
[끄적끄적] Keychain 관련 고민 (2) | 2023.12.14 |