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

485 lines
17 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;
2025-11-07 15:03:45 +08:00
2025-11-07 16:58:33 +08:00
@property (nonatomic, strong) UIImageView *leftBgImageView;
@property (nonatomic, strong) UIImageView *rightBgImageView;
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-07 21:37:31 +08:00
///
@property (nonatomic, strong) UIImageView *dragArrowImageView;
2025-11-06 16:05:28 +08:00
//
2025-11-07 21:37:31 +08:00
// HWPanModalContentView `containerView` HWPanModalContainerView
// 访 UIView
// `currentPresentationState` - [UIView currentPresentationState] unrecognized selector
// contentContainerView
@property (nonatomic, strong) UIView *contentContainerView;
2025-11-06 16:05:28 +08:00
@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 20:58:14 +08:00
// self.backgroundColor = [UIColor colorWithHex:0xE8FFF4]; // 绿
self.backgroundColor = [UIColor clearColor];
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;
}
2025-11-07 21:37:31 +08:00
//
- (void)panModalTransitionDidFinish {
[self kb_updateDragArrowForState:self.hw_presentationState];
}
2025-11-06 16:05:28 +08:00
- (void)didChangeTransitionToState:(PresentationState)state {
2025-11-07 21:37:31 +08:00
//
[self kb_updateDragArrowForState:state];
2025-11-06 16:05:28 +08:00
}
- (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) {
2025-11-07 16:58:33 +08:00
make.left.right.equalTo(self).inset(0);
2025-11-07 19:33:54 +08:00
make.top.equalTo(self.bigWhiteContentView).offset(40);
2025-11-07 16:29:15 +08:00
make.bottom.equalTo(self.bigWhiteContentView);
}];
2025-11-07 16:58:33 +08:00
[self.secWhiteContentView addSubview:self.leftBgImageView];
[self.secWhiteContentView addSubview:self.rightBgImageView];
[self.leftBgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.equalTo(self.secWhiteContentView);
2025-11-07 20:58:14 +08:00
// make.bottom.equalTo(self.secWhiteContentView);
2025-11-07 16:58:33 +08:00
}];
2025-11-07 19:33:54 +08:00
[self.rightBgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.equalTo(self.secWhiteContentView);
2025-11-07 20:58:14 +08:00
// make.bottom.equalTo(self.secWhiteContentView);
2025-11-07 19:33:54 +08:00
}];
2025-11-07 16:58:33 +08:00
2025-11-07 16:29:15 +08:00
2025-11-06 16:05:28 +08:00
//
2025-11-07 16:29:15 +08:00
[self.secWhiteContentView addSubview:self.topBar];
2025-11-07 21:37:31 +08:00
[self.secWhiteContentView addSubview:self.contentContainerView];
//
[self addSubview:self.dragArrowImageView];
2025-11-07 16:29:15 +08:00
2025-11-07 19:33:54 +08:00
// z
[self.secWhiteContentView insertSubview:self.personImageView belowSubview:self.leftBgImageView];
[self.secWhiteContentView insertSubview:self.hgImageView belowSubview:self.rightBgImageView];
// zPosition < / < <
self.leftBgImageView.layer.zPosition = 0;
self.rightBgImageView.layer.zPosition = 0;
self.personImageView.layer.zPosition = 1;
self.hgImageView.layer.zPosition = 1;
self.topBar.layer.zPosition = 3;
2025-11-07 16:46:08 +08:00
2025-11-07 16:58:33 +08:00
// [self.topBar addSubview:self.leftImageView];
// [self.topBar addSubview:self.rightImageView];
2025-11-07 16:29:15 +08:00
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 20:58:14 +08:00
CGFloat topPadding = 12; //
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);
}];
2025-11-07 21:37:31 +08:00
//
[self.dragArrowImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.topBar);
make.bottom.equalTo(self.topBar.mas_top).offset(-20);
make.width.mas_equalTo(18);
make.height.mas_equalTo(18);
}];
2025-11-07 16:29:15 +08:00
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
}];
2025-11-07 21:37:31 +08:00
[self.contentContainerView mas_makeConstraints:^(MASConstraintMaker *make) {
2025-11-06 16:05:28 +08:00
make.top.equalTo(self.topBar.mas_bottom).offset(8);
2025-11-07 20:58:14 +08:00
make.left.right.equalTo(self.secWhiteContentView).inset(20);
2025-11-07 16:29:15 +08:00
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);
2025-11-07 20:58:14 +08:00
make.bottom.equalTo(self.topBar.mas_top).offset(11);
2025-11-07 19:33:54 +08:00
make.width.mas_equalTo(53);
make.height.mas_equalTo(81);
2025-11-07 16:29:15 +08:00
}];
[self.hgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self).offset(-38);
2025-11-07 19:33:54 +08:00
make.bottom.equalTo(self.topBar.mas_top).offset(16);
make.width.mas_equalTo(82);
make.height.mas_equalTo(66);
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 {
2025-11-07 20:58:14 +08:00
[self switchToIndex:sender.tag animated:false];
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];
2025-11-07 21:37:31 +08:00
[self.contentContainerView addSubview:target.view];
2025-11-06 16:05:28 +08:00
[target.view mas_makeConstraints:^(MASConstraintMaker *make) {
2025-11-07 21:37:31 +08:00
make.left.top.right.equalTo(self.contentContainerView);
make.bottom.equalTo(self.contentContainerView).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) {
2025-11-07 19:33:54 +08:00
self.leftBgImageView.hidden = NO;
self.rightBgImageView.hidden = YES;
self.personImageView.hidden = YES;
self.hgImageView.hidden = NO;
} else {
self.leftBgImageView.hidden = YES;
self.rightBgImageView.hidden = NO;
self.personImageView.hidden = NO;
self.hgImageView.hidden = YES;
}
//
UIView *visibleBg = self.rightBgImageView.hidden ? self.leftBgImageView : self.rightBgImageView;
if (!self.hgImageView.hidden) {
[self.secWhiteContentView insertSubview:self.hgImageView belowSubview:visibleBg];
}
if (!self.personImageView.hidden) {
[self.secWhiteContentView insertSubview:self.personImageView belowSubview:visibleBg];
2025-11-07 16:29:15 +08:00
}
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];
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 *)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;
}
2025-11-07 21:37:31 +08:00
- (UIView *)contentContainerView{
if (!_contentContainerView) {
_contentContainerView = [[UIView alloc] init];
2025-11-07 16:29:15 +08:00
}
2025-11-07 21:37:31 +08:00
return _contentContainerView;
2025-11-07 16:29:15 +08:00
}
- (UIImageView *)underlineImageView{
if (!_underlineImageView) {
_underlineImageView = [[UIImageView alloc] init];
_underlineImageView.image = [UIImage imageNamed:@"home_bar_underline"];
}
return _underlineImageView;
}
2025-11-07 21:37:31 +08:00
//
- (UIImageView *)dragArrowImageView {
if (!_dragArrowImageView) {
_dragArrowImageView = [[UIImageView alloc] init];
_dragArrowImageView.contentMode = UIViewContentModeScaleAspectFit;
// Short
_dragArrowImageView.image = [UIImage imageNamed:@"home_up_arrow"];
}
return _dragArrowImageView;
}
//
- (void)kb_updateDragArrowForState:(PresentationState)state {
NSString *imgName = (state == PresentationStateMedium) ? @"home_down_arrow" : @"home_up_arrow";
UIImage *img = [UIImage imageNamed:imgName];
if (img && self.dragArrowImageView.image != img) {
//
[UIView transitionWithView:self.dragArrowImageView
duration:0.18
options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionBeginFromCurrentState
animations:^{
self.dragArrowImageView.image = img;
} completion:nil];
}
}
2025-11-07 16:58:33 +08:00
- (UIImageView *)leftBgImageView{
if (!_leftBgImageView) {
_leftBgImageView = [[UIImageView alloc] init];
_leftBgImageView.image = [UIImage imageNamed:@"home_left_bg"];
}
return _leftBgImageView;
}
- (UIImageView *)rightBgImageView{
if (!_rightBgImageView) {
_rightBgImageView = [[UIImageView alloc] init];
_rightBgImageView.image = [UIImage imageNamed:@"home_right_bg"];
}
return _rightBgImageView;
}
2025-11-06 16:05:28 +08:00
@end