iOS 網(wǎng)頁和原生列表混合布局開發(fā)(文章+評論)

我們總會遇見特別不適合使用原生開發(fā)的頁面外构,比如一個文章詳情頁,上面是文章下面是評論播掷,就比如現(xiàn)在用的簡書的手機版這樣审编,那么這種需求應該怎么做呢?
最好的方法當然是整個頁面都是用H5開發(fā)歧匈,哈哈哈割笙;當然下面評論有時候會有很多交互導致得用原生控件開發(fā),那這里就面臨著嚴峻的問題了,上面是網(wǎng)頁可以滑動伤溉,下面是評論最好是用列表做,具體怎么組合起來就值得我們說道說道了妻率,當然方法有很多種乱顾,我這里講解一種我覺得各方面都不錯的。

ps:問題總結(jié)起來還是兩個滑動視圖上下滑動問題所以用我之前講解的多個滑動視圖沖突解決http://www.reibang.com/p/cfe517ce437b 也可以解決不過這樣使用H5那面配合的地方比較多宫静。這個不多說走净,下面介紹我們今天要說的。

這個方案的整體思路:把web和table同時加在一個底層ScrollView上面孤里,滑動底層ScrollView同時不斷控制web和table的偏移量位置伏伯,使頁面看起來是兩個滑動視圖連在一起的。

整體結(jié)構(gòu)如圖
webAndtable.png

一捌袜,視圖介紹

黃色的是底層ScrollView说搅,青色的一個加在底層ScrollView上的view(這里我們叫它contentView),然后正加載簡書網(wǎng)頁的是web虏等,紅色部分是table弄唧。web和table再加contentView上,這樣我們控制整體位置的時候使用contentView就行霍衫;

二候引,視圖之間的高度關系:

web和table的最大高度都是底層ScrollView的高度,這樣做可以正好讓其中一個充滿整個底層ScrollView敦跌。
contentView的高度是web和table高度的和(畢竟就是為了放他們兩)澄干。
底層ScrollView的可滑動高度這里設定成web和table可滑動高度的總和,方便滑動處理柠傍。
ps:具體代碼在后面麸俘。

三,滑動處理思路

滑動都靠底層ScrollView携兵,禁用web和table的滑動疾掰,上面說了底層ScrollView的可滑動高度是web和table的總和所以進度條是正常的。
然后在滑動的同時不斷調(diào)整contentView的位置徐紧,web和table的偏移量静檬,使頁面效果看起來符合預期。

四并级,滑動處理具體操作拂檩,整個滑動可以分成五階段。ps:offsety 底層ScrollView的偏移量

1.offsety<=0,不用過多操作正吵氨蹋滑動
2.web內(nèi)部可以滑動稻励。控制contentView懸浮,使web在屏幕可視區(qū)域望抽。同時修改web的偏移量加矛。
3.web滑動到頭。保持contentView的位置和web的偏移量煤篙,使table滑動到屏幕可視區(qū)域
4.table內(nèi)部可以滑動斟览。控制contentView懸浮辑奈,使table在屏幕可視區(qū)域苛茂。同時修改table的偏移量。
5.table滑動到頭鸠窗。保持contentView的位置和table的偏移量妓羊,使頁面滑動到底部
四,具體代碼
1.因為web和table都是隨內(nèi)容變高的稍计,這里選擇通過監(jiān)聽兩者高度變化躁绸,同時刷新各個控件的高度,對應第二步驟

//添加監(jiān)聽
[self.webView addObserver:self forKeyPath:@"scrollView.contentSize" options:NSKeyValueObservingOptionNew context:nil];
 [self.collectionView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
//刷新各個控件高度
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    if (object == _webView) {
        if ([keyPath isEqualToString:@"scrollView.contentSize"]) {
            [self updateContainerScrollViewHeight];
        }
    }else if(object == _collectionView) {
        if ([keyPath isEqualToString:@"contentSize"]) {
            [self updateContainerScrollViewHeight];
        }
    }
}

- (void)updateContainerScrollViewHeight{
    CGFloat webViewContentHeight = self.webView.scrollView.contentSize.height;
    CGFloat collectionContentHeight = self.collectionView.contentSize.height;
    
    if (webViewContentHeight == _lastWebViewContentHeight && collectionContentHeight == _lastCollectionContentHeight) {
        return;
    }
    
    _lastWebViewContentHeight = webViewContentHeight;
    _lastCollectionContentHeight = collectionContentHeight;
    
    self.containerScrollView.contentSize = CGSizeMake(self.view.width, webViewContentHeight + collectionContentHeight);
    
    CGFloat webViewHeight = (webViewContentHeight < _contentHeight) ?webViewContentHeight :_contentHeight;
    CGFloat collectionHeight = collectionContentHeight < _contentHeight ?collectionContentHeight :_contentHeight;
    self.webView.height = webViewHeight <= 0.1 ?0.1 :webViewHeight;
    self.contentView.height = webViewHeight + collectionHeight;
    self.collectionView.height = collectionHeight;
    self.collectionView.top = self.webView.bottom;
    
    [self scrollViewDidScroll:self.containerScrollView];
}

2.具體滑動處理代碼

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (_containerScrollView != scrollView) {
        return;
    }
    
    CGFloat offsetY = scrollView.contentOffset.y;
    
    CGFloat webViewHeight = self.webView.height;
    CGFloat collectionHeight = self.collectionView.height;
    
    CGFloat webViewContentHeight = self.webView.scrollView.contentSize.height;
    CGFloat collectionContentHeight = self.collectionView.contentSize.height;
    if (offsetY <= 0) {
        self.contentView.top = 0;
        self.webView.scrollView.contentOffset = CGPointZero;
        self.collectionView.contentOffset = CGPointZero;
    }else if(offsetY < webViewContentHeight - webViewHeight){
        self.contentView.top = offsetY;
        self.webView.scrollView.contentOffset = CGPointMake(0, offsetY);
        self.collectionView.contentOffset = CGPointZero;
    }else if(offsetY < webViewContentHeight){
        self.contentView.top = webViewContentHeight - webViewHeight;
        self.webView.scrollView.contentOffset = CGPointMake(0, webViewContentHeight - webViewHeight);
        self.collectionView.contentOffset = CGPointZero;
    }else if(offsetY < webViewContentHeight + collectionContentHeight - collectionHeight){
        self.contentView.top = offsetY - webViewHeight;
        self.collectionView.contentOffset = CGPointMake(0, offsetY - webViewContentHeight);
        self.webView.scrollView.contentOffset = CGPointMake(0, webViewContentHeight - webViewHeight);
    }else if(offsetY <= webViewContentHeight + collectionContentHeight ){
        self.contentView.top = self.containerScrollView.contentSize.height - self.contentView.height;
        self.webView.scrollView.contentOffset = CGPointMake(0, webViewContentHeight - webViewHeight);
        self.collectionView.contentOffset = CGPointMake(0, collectionContentHeight - collectionHeight);
    }else {
        //do nothing
        NSLog(@"do nothing");
    }
}

打完收工丙猬。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涨颜,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子茧球,更是在濱河造成了極大的恐慌庭瑰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抢埋,死亡現(xiàn)場離奇詭異弹灭,居然都是意外死亡,警方通過查閱死者的電腦和手機揪垄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門穷吮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饥努,你說我怎么就攤上這事捡鱼。” “怎么了酷愧?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵驾诈,是天一觀的道長。 經(jīng)常有香客問我溶浴,道長乍迄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任士败,我火速辦了婚禮闯两,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己漾狼,他們只是感情好重慢,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逊躁,像睡著了一般伤锚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上志衣,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音猛们,去河邊找鬼念脯。 笑死,一個胖子當著我的面吹牛弯淘,可吹牛的內(nèi)容都是我干的绿店。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼庐橙,長吁一口氣:“原來是場噩夢啊……” “哼假勿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起态鳖,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤转培,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浆竭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浸须,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年邦泄,在試婚紗的時候發(fā)現(xiàn)自己被綠了删窒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡顺囊,死狀恐怖肌索,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情特碳,我是刑警寧澤诚亚,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站测萎,受9級特大地震影響亡电,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜硅瞧,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一份乒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦或辖、人聲如沸瘾英。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缺谴。三九已至,卻和暖如春耳鸯,著一層夾襖步出監(jiān)牢的瞬間湿蛔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工县爬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阳啥,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓财喳,卻偏偏與公主長得像察迟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子耳高,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355