iOS實(shí)現(xiàn)懸停交互視圖

HHModule.gif

We grow neither better nor worse as we grow old but more like ourselves.( M. L. Becker )
隨著年齡的增長(zhǎng),我們并沒(méi)有變得更好也沒(méi)有變得更壞,而是變得更象我們自己(貝克爾

下載地址:Github

層級(jí)說(shuō)明:
此控件為UIView,分三個(gè)部分,頂部為headerView,setter方法設(shè)置,中間的title視圖為可以滾動(dòng)的scrollView,可以設(shè)置標(biāo)題選擇和未選擇的顏色,底部為collectionView嵌套的tableView,而tableView為用戶(hù)注冊(cè)的類(lèi)名加載而來(lái),需要繼承HHBaseTableView,重寫(xiě)父類(lèi)的一些方法,用戶(hù)只需要管理headerView和tableView即可,詳見(jiàn)Demo.

viewStack.png

該視圖包含三個(gè)小模塊:

  • BaseConstruct :可選8中waitHud樣式,提醒文字,錯(cuò)誤頁(yè)面;
  • RefreshManager :包含三種刷新樣式,KVO監(jiān)聽(tīng),使用簡(jiǎn)單;
  • LinkageView :指示器聯(lián)動(dòng)

傳值:

  • 事件傳遞
    傳值方式為:KVC字典傳值,控制器定義Block,以key值區(qū)分事件,保存在HHHoverLinkageViewactionDict中,父視圖負(fù)責(zé)分發(fā)到各個(gè)子視圖,子視圖各個(gè)以key值獲得自己需要調(diào)用的Blcok。
@property (nonatomic, strong) NSMutableDictionary *actionDict;//存儲(chǔ)block,給子視圖傳遞事件
AddBlockAction(_hoverView.actionDict, HeaderViewButtonClick, ^(NSString *text){
        
        [wSelf showText:text];
    });
  • 值傳遞
    主視圖中暴露了二個(gè)屬性,用戶(hù)根據(jù)需要設(shè)置數(shù)據(jù)
@property (nonatomic, copy)   NSDictionary *dataDict;//需要傳遞給子視圖tableView的字典
@property (nonatomic, copy)   NSArray *dataArray;//需要傳遞給子視圖tableView的數(shù)組

用戶(hù)自定義的tableView只需要重寫(xiě)下面方法即可獲得數(shù)據(jù)

@property (nonatomic, copy)   NSDictionary *dataDict;//子類(lèi)重寫(xiě) "setter" 獲得數(shù)據(jù)
@property (nonatomic, copy)   NSArray *dataArray;//子類(lèi)重寫(xiě) "setter" 獲得數(shù)據(jù)
@property (nonatomic, strong) NSIndexPath *indexPath;//子類(lèi)重寫(xiě)"setter" 獲得索引

常用方法:

_hoverView.linkageView.titleArray = self.titleArray;//決定中間title的標(biāo)題
_hoverView.tableViewClassName = NSStringFromClass([HHHoverTableView class]);//注冊(cè)類(lèi)名需要繼承"HHBaseTableView",加載用戶(hù)自定義的tableView

知識(shí)點(diǎn):

  • 1tableViewcontentOffset實(shí)際上就是它的bounds,只需要在scrollViewDidScroll中時(shí)時(shí)改變?yōu)?,即是:scrollView.contentOffset = CGPointZero就可以控制它父視圖的坐標(biāo),同時(shí)加上一系列的邊界監(jiān)測(cè),就可實(shí)現(xiàn)上述效果。
  • 2 :關(guān)鍵字copy、assignweakstrong的靈活運(yùn)用
    對(duì)于以下兩種是沒(méi)有太多意義的,每次賦值都會(huì)copy一個(gè)不可變對(duì)象設(shè)置屬性,如果使用插入刪除編譯時(shí)不會(huì)報(bào)錯(cuò),但運(yùn)行時(shí)會(huì)導(dǎo)致崩潰。
@property (nonatomic, copy) NSMutableDictionary *dictM;
@property (nonatomic, copy) NSMutableArray *arrayM;

對(duì)于以下類(lèi)型的屬性,非一致類(lèi)型,都會(huì)拷貝copy一個(gè)不可變對(duì)象設(shè)置屬性,否則直接引用

@property (nonatomic, copy) NSDictionary *dict;
@property (nonatomic, copy) NSArray *array;

copy相對(duì)于strong它是安全的,strong為引用性,指針可指向任意對(duì)象,造成不安全的訪問(wèn)。

weakassign一個(gè)對(duì)象銷(xiāo)毀時(shí)自動(dòng)賦值nil,一個(gè)不會(huì)。一般對(duì)象解循環(huán)引用的時(shí)候用weak,而assign常用語(yǔ)基礎(chǔ)類(lèi)型。下面舉一個(gè)assign不常用到的例子,也是在寫(xiě)此Demo中遇到的。
A對(duì)象是一個(gè)視圖,擁有子視圖屬性B,子視圖B擁有對(duì)象屬性C,C通過(guò)KVO監(jiān)聽(tīng)B屬性的變化。為了保持解耦合,我把B傳入C,Cweak引用B設(shè)為自己的屬性D,在Cdealloc中,讓D移除觀察者C。

視圖層級(jí).png

原則上看是沒(méi)有任何問(wèn)題的,實(shí)際在演示中發(fā)現(xiàn),B視圖會(huì)先銷(xiāo)毀,而后C才會(huì)銷(xiāo)毀,當(dāng)B銷(xiāo)毀后,C的屬性D也會(huì)指向nil,在Cdealloc中,無(wú)法移除觀察者,導(dǎo)致程序崩潰,此時(shí)用assign,卻能解決這個(gè)問(wèn)題,雖然B銷(xiāo)毀了,C依然可以拿到地址,移除觀察者,正常銷(xiāo)毀。
最后:

由于本人目前知識(shí)儲(chǔ)備有限,以上說(shuō)明中,也許會(huì)存在一些錯(cuò)誤的描述和認(rèn)識(shí),還希望發(fā)現(xiàn)后你能及時(shí)指出,以免誤導(dǎo)其他讀者,在此謝過(guò)。

warning 此版本有一些BUG,可作為參考,建議使用簡(jiǎn)化版
collectionview嵌套tableview實(shí)現(xiàn)懸停交互

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,607評(píng)論 30 472
  • 十里桃花 那是一個(gè)桃花盛開(kāi)的季節(jié),院子里的幾株桃樹(shù)托起一片花海,潔白的桃花一朵緊挨著一朵,擠滿(mǎn)了整個(gè)枝丫。有...
    陳流閱讀 1,101評(píng)論 0 4
  • 聽(tīng)信狡性,縱放心猿 當(dāng)家才知柴米價(jià),養(yǎng)子方曉父娘恩 徐步幽林 蛇頭上的蒼蠅,自來(lái)的衣食 藤攀葛繞,柏翠松青 花草俱...
    笑樂(lè)嗎閱讀 1,498評(píng)論 0 0
  • ....
    小絔閱讀 205評(píng)論 0 1

友情鏈接更多精彩內(nèi)容