Files
keyboard/keyBoard/Class/Home/V/KBPanModalView.m

351 lines
11 KiB
Mathematica
Raw Normal View History

2025-11-06 16:05:28 +08:00
//
// KBPanModalView.m
// keyBoard
//
// Created by Mac on 2025/11/6.
//
#import "KBPanModalView.h"
#import "KBDirectionIndicatorView.h"
//
#import "HomeHotVC.h"
#import "HomeRankVC.h"
@interface KBPanModalView()
@property (nonatomic, strong) KBDirectionIndicatorView *indicator;
//
@property (nonatomic, strong) UIView *topBar;
2025-11-07 15:03:45 +08:00
@property (nonatomic, strong) UIView *contentView;
@property (nonatomic, strong) UIImageView *leftImageView;
@property (nonatomic, strong) UIImageView *rightImageView;
/// 👑
@property (nonatomic, strong) UIImageView *hgImageView;
2025-11-06 16:05:28 +08:00
@property (nonatomic, strong) UIButton *hotButton;
@property (nonatomic, strong) UIButton *rankButton;
@property (nonatomic, strong) UIView *underlineView; // 线
//
@property (nonatomic, strong) UIView *containerView;
@property (nonatomic, strong) UIViewController *currentChild;
@property (nonatomic, strong) HomeHotVC *hotVC;
@property (nonatomic, strong) HomeRankVC *rankVC;
2025-11-06 19:19:12 +08:00
@property (nonatomic, assign) NSInteger currentIndex;
2025-11-06 16:05:28 +08:00
@end
@implementation KBPanModalView
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
2025-11-06 21:38:58 +08:00
// self.backgroundColor = [UIColor redColor];
// HWBackgroundConfig *config = [HWBackgroundConfig configWithBehavior:HWBackgroundBehaviorDefault];
// config.backgroundAlpha = 0;
// [self.hw_dimmedView reloadConfig:config];
2025-11-07 15:03:45 +08:00
//
[self addSubview:self.contentView];
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self).inset(16);
make.top.equalTo(self).offset(48);
make.bottom.equalTo(self);
}];
[self.contentView addSubview:self.leftImageView];
[self.contentView addSubview:self.rightImageView];
[self.leftImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.contentView);
make.top.equalTo(self.contentView);
make.height.mas_equalTo(79);
}];
[self.rightImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.contentView);
make.top.equalTo(self.contentView);
make.height.equalTo(self.leftImageView);
}];
2025-11-06 16:05:28 +08:00
// +
[self setupTopButtonsAndContainer];
//
[self switchToIndex:0 animated:NO];
}
return self;
}
- (HWBackgroundConfig *)backgroundConfig {
HWBackgroundConfig *config = [HWBackgroundConfig configWithBehavior:HWBackgroundBehaviorDefault];
config.backgroundAlpha = 0;
2025-11-07 15:03:45 +08:00
config.blurTintColor = [UIColor clearColor];
return config;
}
2025-11-06 16:05:28 +08:00
- (UIView<HWPanModalIndicatorProtocol> *)customIndicatorView {
if (!_indicator) _indicator = [KBDirectionIndicatorView new];
return _indicator;
}
//- (void)panModalTransitionDidFinish {
// //
// [self.indicator applyPresentationState:self.hw_presentationState];
// //
// //
// if (self.topBar && self.topBar.alpha < 1.0) {
// [UIView animateWithDuration:0.18 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
// self.topBar.alpha = 1.0;
// } completion:nil];
// }
//}
- (void)didChangeTransitionToState:(PresentationState)state {
// //
// [self.indicator applyPresentationState:state];
}
- (PanModalHeight)shortFormHeight {
2025-11-07 14:21:03 +08:00
return PanModalHeightMake(PanModalHeightTypeMaxTopInset, self.minHeight);
2025-11-06 16:05:28 +08:00
}
- (PanModalHeight)longFormHeight {
return PanModalHeightMake(PanModalHeightTypeMaxTopInset, self.topInset ?: 100);
}
- (PresentationState)originPresentationState {
return PresentationStateShort; //
}
- (BOOL)anchorModalToLongForm {
return YES; // long
}
- (BOOL)allowsPullDownWhenShortState {
return NO; // short
}
2025-11-06 19:19:12 +08:00
- (CGFloat)topOffset{
return 0.001;
}
2025-11-06 16:05:28 +08:00
/// 穿
- (BOOL)allowsTouchEventsPassingThroughTransitionView {
return YES;
}
-(BOOL)shouldAutoSetPanScrollContentInset{
return NO;
}
- (UIScrollView *)panScrollable {
2025-11-06 19:19:12 +08:00
if (self.currentIndex == 0) {
return self.hotVC.tableView;
}
2025-11-06 19:51:50 +08:00
return self.rankVC.collectionView;
2025-11-06 16:05:28 +08:00
}
//
- (BOOL)allowsDragToDismiss {
return NO;
}
//
//- (BOOL)showDragIndicator{
// return NO;
//}
//
//
- (BOOL)allowsTapBackgroundToDismiss {
return NO;
}
//
//- (NSTimeInterval)transitionDuration {
// return 0;
//}
////
//- (BOOL)isHapticFeedbackEnabled {
// return NO;
//}
#pragma mark - UI
- (void)setupTopButtonsAndContainer {
//
self.topBar = [[UIView alloc] init];
2025-11-07 15:03:45 +08:00
// self.topBar.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
2025-11-06 16:05:28 +08:00
[self addSubview:self.topBar];
//
2025-11-06 19:19:12 +08:00
// self.topBar.alpha = 0.0;
2025-11-06 16:05:28 +08:00
//
self.hotButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.hotButton setTitle:@"热门" forState:UIControlStateNormal];
[self.hotButton setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];
[self.hotButton setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
self.hotButton.titleLabel.font = [UIFont boldSystemFontOfSize:16];
self.hotButton.tag = 0;
[self.hotButton addTarget:self action:@selector(onTapTopButton:) forControlEvents:UIControlEventTouchUpInside];
[self.topBar addSubview:self.hotButton];
self.rankButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.rankButton setTitle:@"排行" forState:UIControlStateNormal];
[self.rankButton setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];
[self.rankButton setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
self.rankButton.titleLabel.font = [UIFont boldSystemFontOfSize:16];
self.rankButton.tag = 1;
[self.rankButton addTarget:self action:@selector(onTapTopButton:) forControlEvents:UIControlEventTouchUpInside];
[self.topBar addSubview:self.rankButton];
// 线
self.underlineView = [[UIView alloc] init];
self.underlineView.backgroundColor = [UIColor blackColor];
self.underlineView.layer.cornerRadius = 1.0;
[self.topBar addSubview:self.underlineView];
//
self.containerView = [[UIView alloc] init];
2025-11-07 15:03:45 +08:00
self.containerView.backgroundColor = [UIColor redColor];
2025-11-06 16:05:28 +08:00
self.containerView.clipsToBounds = YES;
[self addSubview:self.containerView];
// Masonry
2025-11-07 15:03:45 +08:00
CGFloat topPadding = 47; //
2025-11-06 16:05:28 +08:00
[self.topBar mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.top.equalTo(self).offset(topPadding);
make.height.mas_equalTo(44);
}];
[self.hotButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.equalTo(self.topBar);
make.left.equalTo(self.topBar);
}];
[self.rankButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.equalTo(self.topBar);
make.right.equalTo(self.topBar);
make.left.equalTo(self.hotButton.mas_right);
make.width.equalTo(self.hotButton);
}];
//
[self.underlineView mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(2);
make.bottom.equalTo(self.topBar.mas_bottom).offset(-2);
make.centerX.equalTo(self.hotButton);
make.width.mas_equalTo(24);
}];
[self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.topBar.mas_bottom).offset(8);
make.left.right.bottom.equalTo(self);
}];
}
#pragma mark - Action
- (void)onTapTopButton:(UIButton *)sender {
[self switchToIndex:sender.tag animated:YES];
2025-11-06 19:19:12 +08:00
// [self hw_panModalSetNeedsLayoutUpdate];
2025-11-06 16:05:28 +08:00
}
#pragma mark - Switch Child
- (void)switchToIndex:(NSInteger)index animated:(BOOL)animated {
2025-11-06 19:19:12 +08:00
self.currentIndex = index;
2025-11-06 16:05:28 +08:00
UIViewController *target = (index == 0) ? self.hotVC : self.rankVC;
if (!target) {
if (index == 0) {
self.hotVC = [HomeHotVC new];
target = self.hotVC;
} else {
self.rankVC = [HomeRankVC new];
target = self.rankVC;
}
}
if (self.currentChild == target) {
//
[self updateButtonStateForIndex:index animated:animated];
return;
}
//
if (self.currentChild) {
[self.currentChild willMoveToParentViewController:nil];
[self.currentChild.view removeFromSuperview];
[self.currentChild removeFromParentViewController];
}
//
// [self addChildViewController:target];
[self.containerView addSubview:target.view];
target.view.backgroundColor = [UIColor colorWithWhite:0.98 alpha:1];
[target.view mas_makeConstraints:^(MASConstraintMaker *make) {
2025-11-06 19:19:12 +08:00
make.left.top.right.equalTo(self.containerView);
make.bottom.equalTo(self.containerView).offset(-KB_TABBAR_HEIGHT);
2025-11-06 16:05:28 +08:00
}];
2025-11-06 19:19:12 +08:00
// [target didMoveToParentViewController:self];
2025-11-06 16:05:28 +08:00
self.currentChild = target;
[self updateButtonStateForIndex:index animated:animated];
}
- (void)updateButtonStateForIndex:(NSInteger)index animated:(BOOL)animated {
self.hotButton.selected = (index == 0);
self.rankButton.selected = (index == 1);
UIButton *btn = (index == 0) ? self.hotButton : self.rankButton;
// 线
[self.underlineView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(2);
make.bottom.equalTo(self.topBar.mas_bottom).offset(-2);
make.centerX.equalTo(btn);
make.width.mas_equalTo(24);
}];
if (animated) {
[UIView animateWithDuration:0.25 animations:^{
[self.topBar layoutIfNeeded];
}];
} else {
[self.topBar layoutIfNeeded];
}
}
2025-11-07 15:03:45 +08:00
- (UIView *)contentView{
if (!_contentView) {
_contentView = [[UIView alloc] init];
}
return _contentView;
}
- (UIImageView *)leftImageView{
if (!_leftImageView) {
_leftImageView = [[UIImageView alloc] init];
_leftImageView.image = [UIImage imageNamed:@"home_left_image"];
_leftImageView.contentMode = UIViewContentModeScaleToFill;
}
return _leftImageView;
}
- (UIImageView *)rightImageView{
if (!_rightImageView) {
_rightImageView = [[UIImageView alloc] init];
_rightImageView.image = [UIImage imageNamed:@"home_right_image"];
_rightImageView.contentMode = UIViewContentModeScaleToFill;
_rightImageView.hidden = true;
}
return _rightImageView;
}
- (UIImageView *)hgImageView{
if (!_hgImageView) {
_hgImageView = [[UIImageView alloc] init];
_hgImageView.image = [UIImage imageNamed:@"home_hg_icon"];
_hgImageView.contentMode = UIViewContentModeScaleToFill;
}
return _hgImageView;
}
2025-11-06 16:05:28 +08:00
@end