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

432 lines
14 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 16:29:15 +08:00
@property (nonatomic, strong) UIView *bigWhiteContentView;
@property (nonatomic, strong) UIView *secWhiteContentView;
2025-11-07 15:03:45 +08:00
/// 👑
@property (nonatomic, strong) UIImageView *hgImageView;
2025-11-07 16:29:15 +08:00
///
@property (nonatomic, strong) UIImageView *personImageView;
@property (nonatomic, strong) UIImageView *leftImageView;
@property (nonatomic, strong) UIImageView *rightImageView;
2025-11-07 15:03:45 +08:00
2025-11-06 16:05:28 +08:00
@property (nonatomic, strong) UIButton *hotButton;
@property (nonatomic, strong) UIButton *rankButton;
2025-11-07 16:29:15 +08:00
@property (nonatomic, strong) UIImageView *underlineImageView; // 线
2025-11-06 16:05:28 +08:00
//
@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-07 16:29:15 +08:00
// HWPanModal _contentView
// Pods/HWPanModal/Sources/View/PanModal/HWPanModalContainerView.m: adjustPanContainerBackgroundColor
// _contentView
2025-11-07 16:46:08 +08:00
self.backgroundColor = [UIColor colorWithHex:0xE8FFF4]; // 绿
2025-11-06 21:38:58 +08:00
// HWBackgroundConfig *config = [HWBackgroundConfig configWithBehavior:HWBackgroundBehaviorDefault];
// config.backgroundAlpha = 0;
// [self.hw_dimmedView reloadConfig:config];
2025-11-07 15:03:45 +08:00
2025-11-07 16:29:15 +08:00
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 {
2025-11-07 16:29:15 +08:00
//
[self addSubview:self.bigWhiteContentView];
[self.bigWhiteContentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self).inset(0);
make.top.equalTo(self).offset(40);
make.bottom.equalTo(self);
}];
[self.bigWhiteContentView addSubview:self.secWhiteContentView];
[self.secWhiteContentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self).inset(16);
make.top.equalTo(self.bigWhiteContentView).offset(47);
make.bottom.equalTo(self.bigWhiteContentView);
}];
2025-11-06 16:05:28 +08:00
//
2025-11-07 16:29:15 +08:00
[self.secWhiteContentView addSubview:self.topBar];
[self.secWhiteContentView addSubview:self.containerView];
2025-11-07 16:46:08 +08:00
// topBar topBar
[self.secWhiteContentView insertSubview:self.personImageView belowSubview:self.topBar];
[self.secWhiteContentView insertSubview:self.hgImageView belowSubview:self.topBar];
2025-11-07 16:29:15 +08:00
[self.topBar addSubview:self.leftImageView];
[self.topBar addSubview:self.rightImageView];
2025-11-06 16:05:28 +08:00
//
self.hotButton = [UIButton buttonWithType:UIButtonTypeCustom];
2025-11-07 16:29:15 +08:00
[self.hotButton setTitle:@"Ranking List" forState:UIControlStateNormal];
2025-11-06 16:05:28 +08:00
[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];
2025-11-07 16:29:15 +08:00
[self.rankButton setTitle:@"Persona circle" forState:UIControlStateNormal];
2025-11-06 16:05:28 +08:00
[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];
// 线
2025-11-07 16:29:15 +08:00
[self.topBar addSubview:self.underlineImageView];
2025-11-06 16:05:28 +08:00
// Masonry
2025-11-07 16:29:15 +08:00
CGFloat topPadding = 0; //
2025-11-06 16:05:28 +08:00
[self.topBar mas_makeConstraints:^(MASConstraintMaker *make) {
2025-11-07 16:29:15 +08:00
make.left.right.equalTo(self.secWhiteContentView);
make.top.equalTo(self.secWhiteContentView).offset(topPadding);
make.height.mas_equalTo(54);
}];
[self.leftImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.topBar);
make.top.equalTo(self.topBar);
make.height.mas_equalTo(54);
}];
[self.rightImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self.topBar);
make.top.equalTo(self.topBar);
make.height.equalTo(self.leftImageView);
2025-11-06 16:05:28 +08:00
}];
[self.hotButton mas_makeConstraints:^(MASConstraintMaker *make) {
2025-11-07 16:29:15 +08:00
make.centerY.equalTo(self.topBar).offset(3);
2025-11-06 16:05:28 +08:00
make.left.equalTo(self.topBar);
}];
[self.rankButton mas_makeConstraints:^(MASConstraintMaker *make) {
2025-11-07 16:29:15 +08:00
make.centerY.equalTo(self.hotButton);
2025-11-06 16:05:28 +08:00
make.right.equalTo(self.topBar);
make.left.equalTo(self.hotButton.mas_right);
make.width.equalTo(self.hotButton);
}];
//
2025-11-07 16:29:15 +08:00
[self.underlineImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(5);
make.bottom.equalTo(self.topBar.mas_bottom).offset(-14);
make.centerX.equalTo(self.hotButton).offset(-0);
make.width.mas_equalTo(78);
2025-11-06 16:05:28 +08:00
}];
[self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.topBar.mas_bottom).offset(8);
2025-11-07 16:29:15 +08:00
make.left.right.equalTo(self.secWhiteContentView).inset(0);
make.bottom.equalTo(self.secWhiteContentView);
}];
[self.personImageView mas_makeConstraints:^(MASConstraintMaker *make) {
2025-11-07 16:46:08 +08:00
//
2025-11-07 16:29:15 +08:00
make.left.equalTo(self).offset(46);
make.bottom.equalTo(self.topBar.mas_top).offset(22);
make.width.mas_equalTo(70);
make.height.mas_equalTo(107);
}];
[self.hgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self).offset(-38);
make.bottom.equalTo(self.topBar.mas_top).offset(12);
make.width.mas_equalTo(97);
make.height.mas_equalTo(78);
2025-11-06 16:05:28 +08:00
}];
2025-11-07 16:29:15 +08:00
2025-11-06 16:05:28 +08:00
}
#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;
// 线
2025-11-07 16:29:15 +08:00
[self.underlineImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(5);
make.bottom.equalTo(self.topBar.mas_bottom).offset(-15);
make.centerX.equalTo(btn).offset(index == 0 ? -6 : -11);
make.width.mas_equalTo(78);
2025-11-06 16:05:28 +08:00
}];
2025-11-07 16:29:15 +08:00
if (index == 0) {
self.leftImageView.hidden = false;
self.rightImageView.hidden = true;
}else{
self.leftImageView.hidden = true;
self.rightImageView.hidden = false;
}
2025-11-06 16:05:28 +08:00
if (animated) {
[UIView animateWithDuration:0.25 animations:^{
[self.topBar layoutIfNeeded];
}];
} else {
[self.topBar layoutIfNeeded];
}
}
2025-11-07 15:03:45 +08:00
2025-11-07 16:29:15 +08:00
- (UIView *)bigWhiteContentView{
if (!_bigWhiteContentView) {
_bigWhiteContentView = [[UIView alloc] init];
_bigWhiteContentView.backgroundColor = [UIColor whiteColor];
_bigWhiteContentView.layer.cornerRadius = 40;
2025-11-07 16:46:08 +08:00
//
_bigWhiteContentView.layer.masksToBounds = NO; // clipsToBounds = NO
2025-11-07 16:29:15 +08:00
}
return _bigWhiteContentView;
}
- (UIView *)secWhiteContentView{
if (!_secWhiteContentView) {
_secWhiteContentView = [[UIView alloc] init];
_secWhiteContentView.backgroundColor = [UIColor colorWithWhite:1 alpha:0.23];
2025-11-07 15:03:45 +08:00
}
2025-11-07 16:29:15 +08:00
return _secWhiteContentView;
2025-11-07 15:03:45 +08:00
}
- (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"];
2025-11-07 16:29:15 +08:00
_rightImageView.contentMode = UIViewContentModeScaleAspectFit;
2025-11-07 15:03:45 +08:00
_rightImageView.hidden = true;
}
return _rightImageView;
}
- (UIImageView *)hgImageView{
if (!_hgImageView) {
_hgImageView = [[UIImageView alloc] init];
_hgImageView.image = [UIImage imageNamed:@"home_hg_icon"];
2025-11-07 16:29:15 +08:00
_hgImageView.contentMode = UIViewContentModeScaleAspectFit;
2025-11-07 15:03:45 +08:00
}
return _hgImageView;
}
2025-11-07 16:29:15 +08:00
- (UIImageView *)personImageView{
if (!_personImageView) {
_personImageView = [[UIImageView alloc] init];
_personImageView.image = [UIImage imageNamed:@"home_person_icon"];
_personImageView.contentMode = UIViewContentModeScaleAspectFit;
}
return _personImageView;
}
- (UIView *)topBar{
if (!_topBar) {
_topBar = [[UIView alloc] init];
}
return _topBar;
}
- (UIView *)containerView{
if (!_containerView) {
_containerView = [[UIView alloc] init];
}
return _containerView;
}
- (UIImageView *)underlineImageView{
if (!_underlineImageView) {
_underlineImageView = [[UIImageView alloc] init];
_underlineImageView.image = [UIImage imageNamed:@"home_bar_underline"];
}
return _underlineImageView;
}
2025-11-06 16:05:28 +08:00
@end