FMHoverScrollKit控件懸停

favimg

效果示例

WYDemo2.gif

這是一個控件懸停的UI效果實現,類似于網易云課堂的詳情頁UI效果


更新 2020 - 11 - 04

由于之前的設計對項目的侵入性太強(需要繼承自代碼提供的父類),導致在項目中實際應用時,很多功能限制,導致諸多不便。本次更新針對這個問題提供了一個抽象層:

  • 管理類
    • FMMixScrollBaseDelegateManager
      將所有交互邏輯放在了這里
  • 配置
    • FMMixScrollConfig
      可配置內容:
/** 傳入的子控制器的數組 ps:不可變數組, 最多不要超過5個(暫不支持滑動)*/
@property (nonatomic, strong) NSArray <UIViewController *>*childVCArr;
/** 傳入的UITableView 或 UICollectionView數組 ps:不可變數組, 最多不要超過5個(暫不支持滑動)*/
@property (nonatomic, strong) NSArray <UIScrollView *>*scrollTorCArr;
/** 轉入的頭部視圖的image圖片的名稱 */
@property (nonatomic, strong) NSString *headImageName;
/** 是否允許headView縮放,默認NO */
@property (nonatomic, assign) BOOL isStretch;
/** 頂部圖片高度 */
@property (nonatomic, assign) CGFloat headImage_H;
/** 按鈕的高度 ps:寬度由按鈕個數決定,平分屏幕寬度 */
@property (nonatomic, assign) CGFloat button_H;
/** bar懸停的位置 ps:默認為navigationBar + statusBar的高度 */
@property (nonatomic, assign) CGFloat barStop_H;
/** button下面指示條的顏色 */
@property (nonatomic, strong) UIColor *indicatorColor;
/** 是否隱藏指示條 */
@property (nonatomic, assign) BOOL isIndicatorHidden;
/** button的名稱 */
@property (nonatomic, strong) NSArray *btnTitleArr;
/** button的選中名稱 */
@property (nonatomic, strong) NSArray *btnSelectedTitleArr;
/** button的font */
@property (nonatomic, strong) UIFont *btnFont;
/** button的selected title color */
@property (nonatomic, strong) UIColor *btnSelectedTitleColor;
/** button的normal titl color*/
@property (nonatomic, strong) UIColor *btnNormalTitleColor;
/** button的背景顏色 */
@property (nonatomic, strong) UIColor *btnBackColor;
/** view 是否需要懶加載,ps:為YES時,子視圖初次初始化時,若bar不在原位,會自動置回 */
@property (nonatomic, assign) BOOL shouldLazyLoad;
/// 測試使用
@property (nonatomic, assign) BOOL isTest;

項目中具體使用示例:(swift 版本)

    lazy var manager: FMMixScrollBaseDelegateManager = {
        // 配置類
        let config = FMMixScrollConfig()
        // 子controller
        let processing = WBWorkRecordProcessingViewController()
        processing.isMixScroll = true
        let success = WBWorkRecordSuccessViewController()
        success.isMixScroll = true
        let failure = WBWorkRecordFailureViewController()
        failure.isMixScroll = true
        // 設置具體配置項
        config.headImage_H = WBWorkRecordDetailHeader.H
        config.childVCArr = [processing, success, failure]
        config.scrollTorCArr = [processing.tableView, success.tableView, failure.tableView]
        config.btnTitleArr = [
            LocalizedString("wbProcessing", value: "處理中", comment: "處理中"),
            LocalizedString("wbSuccess", value: "成功", comment: "成功"),
            LocalizedString("wbFailure", value: "失敗", comment: "失敗")]
        config.btnBackColor = UIColor.appWhite
        let manager = FMMixScrollBaseDelegateManager(config: config, fatherController: self)
        // 設置子controller的delegate為manager
        processing.delegate = manager
        success.delegate = manager
        failure.delegate = manager
        // 設置 manager的delegate為當前控制器(即父控制器)
        manager.delegate = self
        return manager
    }()

    // 實現manager的代理方法
    extension WBWorkRecordDetailViewController: FMMixScrollManagerDelegate {
    
    func currentSelectedIndex(_ index: Int) {
        headerView.updateLabelTextColor(index)
    }
    
}

1.工程引入FMBaseViewController, 并添加要自定義的controller

  • 有關頭部image及button的相關設置通過,FMBaseViewController的屬性進行設置,示例代碼如下:
FMBaseViewController *bvc = [[FMBaseViewController alloc] init];
bvc.btnBackColor = [UIColor cyanColor];
bvc.btnTitleArr = @[@"張三", @"李四", @"王五"];
bvc.indicatorColor = [UIColor yellowColor];
bvc.isIndicatorHidden = YES;
bvc.headImage_H = 100;
bvc.button_H = 30;
bvc.headImageName = @"picture_3";
bvc.isStretch = NO;

2.注意:自定義的controller 必須繼承于FMBaseTableViewController.h,

  • 子控制器類型1 :FMTableViewStylePlain 初始化代碼如下:
FMT2ViewController *t2 = [[FMT2ViewController alloc] initWithTableViewStyle:FMTableViewStylePlain];
或者(default)
FMT1ViewController *t1 = [[FMT1ViewController alloc] init];
  • 子控制器類型2:FMTableViewStyleGroup 初始化代碼如下:
FMT2ViewController *t2 = [[FMT2ViewController alloc] initWithTableViewStyle:FMTableViewStyleGrouped];
或者(用屬性修改)
FMT1ViewController *t2 = [[FMT1ViewController alloc] init];
t2.tableViewStyle = FMTableViewStyleGrouped;

3.頭部視圖是否可以拉伸:

isStretch 屬性(default is YES)
  • 測試效果查看,在AppDelegate.m 的launch函數中添加(或替換)如下代碼:
FMBaseViewController *bvc = [[FMBaseViewController alloc] init];
    self.window.rootViewController = bvc;
    [self.window makeKeyAndVisible];
  • 自定義子controller初始化后傳入該數組childVCArr,示例代碼如下:
    FMBaseViewController *bvc = [[FMBaseViewController alloc] init];
    FMT1ViewController *t1 = [[FMT1ViewController alloc] init];
    FMT2ViewController *t2 = [[FMT2ViewController alloc] initWithTableViewStyle:FMTableViewStyleGrouped];
    FMT3ViewController *t3= [[FMT3ViewController alloc] init];
    bvc.childVCArr = @[t1, t2, t3];

子控制器最好不要超過5個, 暫不支持滑動(以后可能添加,敬請期待!)

  • headView上的內容可自定義添加,通過 ftc.headView可拿到head部分的視圖添加自己的控件。
  • 支持cocoaPods 安裝
pod search FMHoverScrollKit
在Podfile中添加
pod "FMHoverScrollKit"
pod install || pod update

2018.08.01更新

增加對UICollectionView的支持,controller必須繼承自FMBaseCollectionViewController

*示例代碼

    FMT1ViewController *t1 = [[FMT1ViewController alloc] init];
    t1.tableViewStyle = FMTableViewStyleGrouped;
    FMC1ViewController *c1 = [[FMC1ViewController alloc] init];
    FMT3ViewController *t3= [[FMT3ViewController alloc] init];

效果示例 - 全collectionView

collectionSupport1.gif

效果示例 - collectionView 和 tableView混合

collectionSupport.gif

github Demo下載地址

點擊去下載

  • (第一次寫簡書,多多指教)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,251評論 4 61
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,970評論 6 342
  • 丙申暮春,騎一匹老馬 任時光頹廢,回到唐朝,回到魏晉 飛云江慢慢為我流向東海,把酒臨風 石頭花開,我是個風一樣自由...
    溫州慕白閱讀 465評論 0 2
  • 中秋佳節,最讓我思念的不是月餅,而是那鮮嫩肥美的上海大閘蟹。。。 在加州,往年雖然吃不到大閘蟹,鮮美的珍寶蟹(Du...
    漾漾美味閱讀 1,142評論 3 2