iOS類似京東/淘寶下拉查看詳情

第一次修改:2017-09-29:對(duì)iOS 11進(jìn)行兼容


前言:最近一直在看Effective Objective-C這本書涤垫,也有在做筆記,打算看完之后寫一篇Effective Objective-C的總結(jié)厂抖,說一下自己的看法和收獲。

言歸正傳克懊,最近項(xiàng)目要實(shí)現(xiàn)一個(gè)類似于京東/淘寶下拉查看商品詳情的功能忱辅,自己就先寫了一個(gè)小的demo七蜘,實(shí)現(xiàn)方式很簡(jiǎn)單,在這里做下記錄與分享墙懂,如有需要改進(jìn)的地方橡卤,歡迎留言探討?。


Github:看這里

testGif.gif

思路整理:
首先分析界面布局损搬,我先是嘗試使用一個(gè)scrollView包含兩個(gè)contentView的方式進(jìn)行實(shí)現(xiàn)碧库,發(fā)現(xiàn)實(shí)現(xiàn)起來(lái)比較繁瑣,因?yàn)檫@樣一來(lái)當(dāng)前界面就會(huì)產(chǎn)生兩到三個(gè)scrollView巧勤,對(duì)偏移值的觀察處理會(huì)比較麻煩嵌灰。嘗試失敗后我就使用了另一種方式進(jìn)行實(shí)現(xiàn)。發(fā)現(xiàn)類似的界面一般分為三部分:

  1. 展示部分視圖颅悉,包含scrollView
  2. 詳情部分視圖伞鲫,包含scrollView
  3. 上下拉時(shí)提示視圖
/**
 首頁(yè)視圖
 */
@property (nonatomic, strong) UIScrollView *firstScrollView;

/**
 上拉視圖
 */
@property (nonatomic, strong) UIView *footView;

/**
 上拉箭頭
 */
@property (nonatomic, strong) UIImageView *footArrowView;

/**
 上拉文字
 */
@property (nonatomic, strong) UILabel *footLabel;

/**
 下拉視圖
 */
@property (nonatomic, strong) UIView *headView;
/**
 下拉箭頭
 */
@property (nonatomic, strong) UIImageView *headArrowView;

/**
 下拉文字
 */
@property (nonatomic, strong) UILabel *headLabel;

/**
 詳情頁(yè)
 */
@property (nonatomic, strong) UIView *secondView;

/**
 詳情頁(yè)scrollView
 */
@property (nonatomic, strong) UIWebView *secondScrollView;

構(gòu)建UI:實(shí)例化三部分視圖,并為scrollView設(shè)置代理签舞,通過代理方法監(jiān)聽偏移值

- (void)createUI{
    
    self.title = @"testProduct";
    
    self.view.backgroundColor = [UIColor whiteColor];
    self.automaticallyAdjustsScrollViewInsets = NO;
    
    [self.view addSubview:self.firstScrollView];
    [self.view addSubview:self.secondView];
    
}

- (UIScrollView *)firstScrollView{
    if (!_firstScrollView) {
        _firstScrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 64, KScreenWidth, KScreenHeight-64)];
        _firstScrollView.backgroundColor = KColorRGB(200, 160, 110);
        _firstScrollView.contentSize = CGSizeMake(0, KScreenHeight);
        _firstScrollView.pagingEnabled = YES;
        _firstScrollView.showsVerticalScrollIndicator = NO;
        _firstScrollView.showsHorizontalScrollIndicator = NO;
        _firstScrollView.delegate = self;
        
        UILabel *label = [MyControl labelWithTitle:@"firstView" fram:CGRectMake(0, 200, KScreenWidth, 40) fontOfSize:20];
        label.textAlignment = NSTextAlignmentCenter;
        [_firstScrollView addSubview:label];
        
        [_firstScrollView addSubview:self.footView];
    }
    return _firstScrollView;
}

- (UIView *)footView{
    if (!_footView) {
        _footView = [[UIView alloc]initWithFrame:CGRectMake(0, KScreenHeight-60-64, KScreenWidth, 40)];
        
        _footArrowView = [[UIImageView alloc]initWithFrame:CGRectMake((KScreenWidth-200)/2, 10, 15, 20)];
        _footArrowView.image = [UIImage imageNamed:@"pullArrow"];
        [_footView addSubview:_footArrowView];
        
        _footLabel = [MyControl labelWithTitle:@"上拉查看詳情" fram:CGRectMake((KScreenWidth-200)/2+50, 0, 150, 40) fontOfSize:14];
        [_footView addSubview:_footLabel];
        
    }
    return _footView;
}

- (UIView *)secondView{
    
    if (!_secondView) {
        _secondView = [[UIView alloc]initWithFrame:CGRectMake(0, KScreenHeight+20, KScreenWidth, KScreenHeight)];
        _secondView.backgroundColor = KColorRGB(241, 241, 241);
        
        UILabel *label = [MyControl labelWithTitle:@"項(xiàng)目詳細(xì)" fram:CGRectMake(0, 0, KScreenWidth, 50) fontOfSize:17];
        label.textAlignment = NSTextAlignmentCenter;
        label.backgroundColor = [UIColor whiteColor];
        
        [_secondView addSubview:self.secondScrollView];
        [_secondView addSubview:label];
    }
    return _secondView;
}

- (UIWebView *)secondScrollView{
    
    if (!_secondScrollView) {
        _secondScrollView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 51, KScreenWidth, KScreenHeight-51-64)];
        _secondScrollView.backgroundColor = KColorRGB(192, 192, 192);
        [_secondScrollView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:URL]]];
        _secondScrollView.scrollView.delegate = self;
        
        [_secondScrollView.scrollView addSubview:self.headView];
    }
    return _secondScrollView;
}

交互處理:

  1. 用戶拖拽時(shí)根據(jù)偏移值動(dòng)態(tài)改變上/下拉提醒視圖的展示效果。
    (1)改變箭頭指向
    (2)改變提示文字
  2. 拖拽結(jié)束時(shí)根據(jù)當(dāng)前偏移值對(duì)界面進(jìn)行處理:
    (1)上拉達(dá)到臨界點(diǎn)柒瓣,改變首頁(yè)和詳情頁(yè)的fram儒搭;
    (2)下拉達(dá)到臨界點(diǎn),改變首頁(yè)和詳情頁(yè)的fram芙贫;
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    NSLog(@"didscroll");
    CGFloat y = scrollView.contentOffset.y;
    
    if (scrollView == _firstScrollView) {
        
        self.secondView.transform = CGAffineTransformMakeTranslation(0, -y);
        if (y < 60) {
            self.footLabel.text = @"上拉查看詳情";
            self.footArrowView.transform = CGAffineTransformIdentity;
        }else{
            self.footLabel.text = @"松開查看詳情";
            self.footArrowView.transform = CGAffineTransformMakeRotation(M_PI);
        }
    }
    
    if ([scrollView isEqual:_secondScrollView.scrollView]) {
        
        CGAffineTransform transform = CGAffineTransformIdentity;
        
        if (y < -60) {
            
            self.headLabel.text = @"松開回到首頁(yè)";
        }else {
            transform = CGAffineTransformMakeRotation(M_PI);
            self.headLabel.text = @"下拉回到首頁(yè)";
        }
        
        self.headArrowView.transform = transform;
    }
    
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    CGFloat y = scrollView.contentOffset.y;
    
    if ([scrollView isEqual:_firstScrollView]) {
        if (y > 60){
            [self transformToSecondView];

        }
    }
    
    if ([scrollView isEqual:_secondScrollView.scrollView]) {
        
        if (y < -60) {
            [self transformToFirstView];
        }
        
    }
}

動(dòng)態(tài)改變首頁(yè)和詳情頁(yè)的fram:

- (void)transformToSecondView{
    [UIView animateWithDuration:0.5 animations:^{
        CGRect rect1 = _firstScrollView.frame;
        CGRect rect2 = _secondView.frame;
        
        rect1.origin.y = -KScreenHeight;
        rect2.origin.y = 0;
        
        self.firstScrollView.frame = rect1;
        self.secondView.frame = rect2;
        
    } completion:^(BOOL finished) {
        self.footArrowView.transform = CGAffineTransformIdentity;
        self.footLabel.text = @"上拉查看詳情";
    }];
}

- (void)transformToFirstView{
    [UIView animateWithDuration:0.5 animations:^{
        CGRect rect1 = _firstScrollView.frame;
        CGRect rect2 = _secondView.frame;
        
        rect1.origin.y = 64;
        rect2.origin.y = KScreenHeight+20;
        
        self.firstScrollView.frame = rect1;
        self.secondView.frame = rect2;
        
    } completion:^(BOOL finished) {
        self.headArrowView.transform = CGAffineTransformIdentity;
        self.headLabel.text = @"下拉回到首頁(yè)";
    }];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搂鲫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子磺平,更是在濱河造成了極大的恐慌魂仍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拣挪,死亡現(xiàn)場(chǎng)離奇詭異擦酌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)菠劝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門赊舶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人赶诊,你說我怎么就攤上這事笼平。” “怎么了舔痪?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵寓调,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我锄码,道長(zhǎng)夺英,這世上最難降的妖魔是什么晌涕? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮秋麸,結(jié)果婚禮上渐排,老公的妹妹穿的比我還像新娘。我一直安慰自己灸蟆,他們只是感情好驯耻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炒考,像睡著了一般可缚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斋枢,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天帘靡,我揣著相機(jī)與錄音,去河邊找鬼瓤帚。 笑死描姚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戈次。 我是一名探鬼主播轩勘,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼怯邪!你這毒婦竟也來(lái)了绊寻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悬秉,失蹤者是張志新(化名)和其女友劉穎澄步,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體和泌,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡村缸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了武氓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片王凑。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖聋丝,靈堂內(nèi)的尸體忽然破棺而出索烹,到底是詐尸還是另有隱情,我是刑警寧澤弱睦,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布百姓,位于F島的核電站,受9級(jí)特大地震影響况木,放射性物質(zhì)發(fā)生泄漏垒拢。R本人自食惡果不足惜旬迹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望求类。 院中可真熱鬧奔垦,春花似錦、人聲如沸尸疆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寿弱。三九已至犯眠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間症革,已是汗流浹背筐咧。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留噪矛,地道東北人量蕊。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艇挨,于是被迫代替她去往敵國(guó)和親危融。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)雷袋、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,104評(píng)論 4 62
  • 感覺有很多的事件需要大家記住辞居,今天我就幫大家先列舉一些: onmouseover 鼠標(biāo)移入 onmouseou...
    BrightenSun閱讀 4,428評(píng)論 0 2
  • 會(huì)考楷怒,為什么叫“會(huì)考”?百思不得其解瓦灶。查了下度娘鸠删,原來(lái)是參加高考的通行證考試。如果會(huì)考沒過贼陶,那么將無(wú)法拿到畢...
    思我君閱讀 289評(píng)論 0 0
  • 感賞今天一大早就看到了大太陽(yáng)刃泡,心情瞬間明媚起來(lái)了。 感賞宇宙爸爸這么好碉怔,昨天還大雨漂泊的烘贴,今天天氣就晴朗起來(lái)了。讓...
    離不若閱讀 393評(píng)論 0 0
  • 友人最近在看一檔比較治愈的綜藝節(jié)目,叫孝麗的民宿芹啥,給我發(fā)微信說锻离,孝利說別人是有錢铺峭,她是巨有錢,所以你看汽纠,總有人在過...
    林希小仙女閱讀 345評(píng)論 0 3