diff --git a/keyBoard/Class/Pay/V/KBVipPayHeaderView.m b/keyBoard/Class/Pay/V/KBVipPayHeaderView.m index 00fae39..c8be5dc 100644 --- a/keyBoard/Class/Pay/V/KBVipPayHeaderView.m +++ b/keyBoard/Class/Pay/V/KBVipPayHeaderView.m @@ -45,7 +45,7 @@ [self.wanImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.right.left.equalTo(self.containerView); make.top.equalTo(self.vipImageView).offset(70); - make.bottom.equalTo(self.containerView); + make.bottom.equalTo(self.containerView).offset(-16); }]; [self.containerView addSubview:self.titleLabel]; @@ -74,7 +74,7 @@ [g1 mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.vipImageView); make.top.equalTo(self.desLabel.mas_bottom).offset(18); - make.height.mas_equalTo(((113))); + make.height.mas_equalTo(((KBFit(122)))); }]; [g2 mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(self.vipImageView); @@ -95,12 +95,29 @@ make.left.equalTo(g3.mas_right).offset(spacing); make.height.equalTo(g1); make.width.equalTo(g1); -// make.bottom.lessThanOrEqualTo(self.containerView).offset(-12); + // 让 header 的高度由内部内容决定:最后一个元素贴到底部 + make.bottom.equalTo(self.containerView).offset(-12); }]; } return self; } +// 关键:让 header 根据 AutoLayout 自适应高度 +- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { + CGFloat targetWidth = layoutAttributes.size.width > 0 ? layoutAttributes.size.width : KB_SCREEN_WIDTH; + // 先把自身宽度设为目标宽,便于系统计算高度 + self.bounds = CGRectMake(0, 0, targetWidth, self.bounds.size.height); + [self setNeedsLayout]; + [self layoutIfNeeded]; + CGSize fit = [self systemLayoutSizeFittingSize:CGSizeMake(targetWidth, UILayoutFittingCompressedSize.height) + withHorizontalFittingPriority:UILayoutPriorityRequired + verticalFittingPriority:UILayoutPriorityFittingSizeLevel]; + CGRect f = layoutAttributes.frame; + f.size.height = ceil(fit.height); + layoutAttributes.frame = f; + return layoutAttributes; +} + #pragma mark - Helpers - (UIView *)gridItemWithImageView:(UIImageView *)iv { // 简单白底圆角卡片承载图标 @@ -109,7 +126,7 @@ // v.layer.cornerRadius = 12; // v.layer.masksToBounds = YES; [v addSubview:iv]; - iv.contentMode = UIViewContentModeScaleAspectFill; + iv.contentMode = UIViewContentModeScaleAspectFit; [iv mas_makeConstraints:^(MASConstraintMaker *make) { // make.center.equalTo(v); // make.width.height.mas_equalTo(40); @@ -193,4 +210,3 @@ } @end - diff --git a/keyBoard/Class/Pay/V/KBVipReviewItemCell.m b/keyBoard/Class/Pay/V/KBVipReviewItemCell.m index aca2622..4c4fe1d 100644 --- a/keyBoard/Class/Pay/V/KBVipReviewItemCell.m +++ b/keyBoard/Class/Pay/V/KBVipReviewItemCell.m @@ -98,11 +98,13 @@ _heartsStack.spacing = 4; _heartsStack.alignment = UIStackViewAlignmentCenter; _heartsStack.distribution = UIStackViewDistributionFillProportionally; - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 1; i++) { UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_5aixin_icon"]]; iv.contentMode = UIViewContentModeScaleAspectFit; [iv mas_makeConstraints:^(MASConstraintMaker *make) { - make.width.height.mas_equalTo(16); + make.height.mas_equalTo(10); + make.width.mas_equalTo(77); + }]; [_heartsStack addArrangedSubview:iv]; } diff --git a/keyBoard/Class/Pay/V/KBVipReviewListCell.m b/keyBoard/Class/Pay/V/KBVipReviewListCell.m index c1cadd1..6acedaa 100644 --- a/keyBoard/Class/Pay/V/KBVipReviewListCell.m +++ b/keyBoard/Class/Pay/V/KBVipReviewListCell.m @@ -57,7 +57,7 @@ static NSString * const kKBVipReviewItemCellId = @"kKBVipReviewItemCellId"; - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { return 10; } - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { return 10; } - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { - return UIEdgeInsetsMake(0, 16, 0, 16); + return UIEdgeInsetsMake(0, 0, 0, 16); } #pragma mark - Lazy diff --git a/keyBoard/Class/Pay/V/KBVipSubscribeCell.m b/keyBoard/Class/Pay/V/KBVipSubscribeCell.m index e7a5d3f..5fcf747 100644 --- a/keyBoard/Class/Pay/V/KBVipSubscribeCell.m +++ b/keyBoard/Class/Pay/V/KBVipSubscribeCell.m @@ -22,10 +22,9 @@ self.contentView.backgroundColor = [UIColor clearColor]; [self.contentView addSubview:self.cardView]; -// self.cardView.backgroundColor = [UIColor redColor]; [self.cardView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.equalTo(self.contentView); - make.top.equalTo(self.contentView).inset(6); + make.top.equalTo(self.contentView).inset(0); make.bottom.equalTo(self.contentView); }]; @@ -37,11 +36,11 @@ [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.cardView).offset(16); - make.top.equalTo(self.cardView).offset(11); + make.bottom.equalTo(self.cardView.mas_centerY).offset(-5); }]; [self.priceLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.titleLabel); - make.top.equalTo(self.titleLabel.mas_bottom).offset(6); + make.top.equalTo(self.cardView.mas_centerY).offset(3); }]; [self.strikeLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.priceLabel.mas_right).offset(10); diff --git a/keyBoard/Class/Pay/VC/KBVipPay.m b/keyBoard/Class/Pay/VC/KBVipPay.m index 5836e74..7054964 100644 --- a/keyBoard/Class/Pay/VC/KBVipPay.m +++ b/keyBoard/Class/Pay/VC/KBVipPay.m @@ -20,6 +20,9 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; @property (nonatomic, assign) NSInteger selectedIndex; // 当前选中的方案索引 @property (nonatomic, strong) UIButton *closeButton; // 当前选中的方案索引 @property (nonatomic, strong) UIImageView *bgImageView; // 全屏背景图 +// Header 自适应测量 +@property (nonatomic, strong) KBVipPayHeaderView *sizingHeader; +@property (nonatomic, assign) CGFloat headerHeight; @end @@ -60,6 +63,8 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; make.width.height.mas_equalTo(36); }]; + // 预计算 Header 高度(由内部约束决定) + self.headerHeight = [self kb_calcHeaderHeightForWidth:KB_SCREEN_WIDTH]; [self.collectionView reloadData]; } @@ -75,6 +80,22 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; if (cell) { [cell applySelected:YES animated:NO]; } } +#pragma mark - Header Height Calc +- (CGFloat)kb_calcHeaderHeightForWidth:(CGFloat)width { + if (width <= 0) { width = KB_SCREEN_WIDTH; } + if (!self.sizingHeader) { + self.sizingHeader = [[KBVipPayHeaderView alloc] initWithFrame:CGRectMake(0, 0, width, 1)]; + } + // 更新目标宽度并触发布局 + self.sizingHeader.bounds = CGRectMake(0, 0, width, self.sizingHeader.bounds.size.height); + [self.sizingHeader setNeedsLayout]; + [self.sizingHeader layoutIfNeeded]; + CGSize size = [self.sizingHeader systemLayoutSizeFittingSize:CGSizeMake(width, UILayoutFittingCompressedSize.height) + withHorizontalFittingPriority:UILayoutPriorityRequired + verticalFittingPriority:UILayoutPriorityFittingSizeLevel]; + return MAX(1, ceil(size.height)); +} + #pragma mark - Action - (void)onTapClose{ [self.navigationController popViewControllerAnimated:true]; @@ -154,8 +175,10 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { if (section == 0) { - // 头部高度 = 484 + 导航栏高度 - return CGSizeMake(KB_SCREEN_WIDTH, 474 + KB_NAV_TOTAL_HEIGHT); + // 动态返回测量好的 Header 高度 + CGFloat w = collectionView.bounds.size.width ?: KB_SCREEN_WIDTH; + if (self.headerHeight <= 1) { self.headerHeight = [self kb_calcHeaderHeightForWidth:w]; } + return CGSizeMake(w, self.headerHeight); } return CGSizeZero; } @@ -180,6 +203,8 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; if (!_collectionView) { UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new]; layout.scrollDirection = UICollectionViewScrollDirectionVertical; + // 每次宽度变化时让布局失效,便于 header 重算高度 + layout.sectionHeadersPinToVisibleBounds = NO; _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; _collectionView.backgroundColor = [UIColor clearColor]; _collectionView.dataSource = self; @@ -204,4 +229,16 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; } return _closeButton; } + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + // 宽度变化时重算 Header 高度并刷新布局 + CGFloat w = self.collectionView.bounds.size.width ?: KB_SCREEN_WIDTH; + CGFloat newH = [self kb_calcHeaderHeightForWidth:w]; + if (fabs(newH - self.headerHeight) > 0.5) { + self.headerHeight = newH; + UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout; + [layout invalidateLayout]; + } +} @end