下拉放大圖片

現(xiàn)在越來越多的APP中存在下拉放大圖片的效果,今天貢獻(xiàn)一下我的實(shí)現(xiàn)這種方法的原理造成,和我遇到的坑显熏。??效果圖

效果圖

GitHub地址:https://github.com/cf0717/DropDownAmplification
介紹一下我實(shí)現(xiàn)的原理
一進(jìn)入界面的時候隱藏掉導(dǎo)航欄,因?yàn)椴僮飨到y(tǒng)的導(dǎo)航欄較麻煩晒屎,不如自己寫一個導(dǎo)航欄來的簡單,在界面要消失的時候在把導(dǎo)航欄顯示出來即可喘蟆,(也可以自己寫一個pop動畫)

-(void)viewWillAppear:(BOOL)animated
{
    self.navigationController.navigationBar.hidden = YES;
}
-(void)viewWillDisappear:(BOOL)animated
{
    self.navigationController.navigationBar.hidden = NO;
}

使用懶加載的方法把假的導(dǎo)航欄,圖片和表格創(chuàng)建出來

這里有幾點(diǎn)注意事項(xiàng):

1.圖片不能添加到UITabview的HeaderView中鼓鲁,因?yàn)槿绻砑拥紿eaderView中蕴轨,那圖片就是表格的一部分了,會跟隨表格的移動和移動骇吭。
2.表格要設(shè)置contentInset來顯示出圖片橙弱,不然會有覆蓋問題
3.圖片的填充模式很重要,一定要是UIViewContentModeScaleAspectFill這樣可以節(jié)省很多代碼
4.圖片和假導(dǎo)航欄要設(shè)置clipsToBounds為YES,不然會有Bug

//lazy
-(UITableView *)tableview
{
    if (!_tableview) {
        _tableview = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, kScreenW, kScreenH) style:UITableViewStylePlain];
        CGFloat headImvH = kScreenW / 320 * 300;
        //這句很重要
        _tableview.contentInset = UIEdgeInsetsMake(headImvH-20, 0, 0, 0);
        
        _tableview.dataSource = self;
        _tableview.delegate = self;
    }
    return _tableview;
}

-(UIImageView *)headImv
{
    if (!_headImv) {
        _headImv = [[UIImageView alloc]init];
        CGFloat headImvH = kScreenW / 320 * 300;
        _headImv.frame = CGRectMake(0, 0, kScreenW, headImvH);
        _headImv.image = [UIImage imageNamed:@"head"];
        //一定記住模式
        _headImv.contentMode = UIViewContentModeScaleAspectFill;
        _headImv.clipsToBounds = YES;
    }
    return _headImv;
}

-(UIView *)navView
{
    if (!_navView) {
        _navView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, kScreenW, 64)];
        _navView.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:0.8];
        _navView.clipsToBounds = YES;
        
        _titLab = [[UILabel alloc]init];
        _titLab.centerX = kScreenW * 0.5;
        _titLab.bounds = CGRectMake(0, 0, 150, 44);
        _titLab.textAlignment = NSTextAlignmentCenter;
        _titLab.font = [UIFont systemFontOfSize:12];
        _titLab.textColor = [UIColor blueColor];
        _titLab.numberOfLines = 0;
        _titLab.text = @"CF\n明天休息了";
        [_navView addSubview:_titLab];
    }
    return _navView;
}

??這些代碼很好理解棘脐,不做解釋

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    //添加順序不能改變
    [self.view addSubview:self.tableview];
    [self.view addSubview:self.headImv];
    [self.view addSubview:self.navView];
    [self setupNavView];
}

#pragma mark - 設(shè)置導(dǎo)航欄
-(void)setupNavView
{
    UIButton *leftNavBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    leftNavBtn.frame = CGRectMake(0, 20, 64, 44);
    [leftNavBtn setTitle:@"返回" forState:UIControlStateNormal];
    [leftNavBtn addTarget:self action:@selector(leftNavClike) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:leftNavBtn];
    
    UIButton *rightNavBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    rightNavBtn.frame = CGRectMake(kScreenW-64, 20, 64, 44);
    [rightNavBtn setTitle:@"更多" forState:UIControlStateNormal];
    [rightNavBtn addTarget:self action:@selector(rightNavClike) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:rightNavBtn];
}

-(void)leftNavClike
{
    [self.navigationController popViewControllerAnimated:YES];
}

-(void)rightNavClike
{
    
}


#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellID = @"cellID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
    }
    cell.textLabel.text = [NSString stringWithFormat:@"測試數(shù)據(jù)——%td",indexPath.row];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"測試數(shù)據(jù)——%td",indexPath.row];
    
    return cell;
}

下面為核心代碼

通過表格的代理方法來改變整體的Frame
這里我發(fā)現(xiàn)一個問題斜筐,如果表格滑動的特別快,那么這個代理方法會存在來不及執(zhí)行的效果蛀缝,或者說偏移量不是線性改變的顷链,從而導(dǎo)致根據(jù)偏移量來計(jì)算的Frame出現(xiàn)問題,所以有些控件建議在設(shè)置Frame的時候屈梁,建議用一個參照來改變(我這里假導(dǎo)航欄里面的文字用偏移出現(xiàn)了問題嗤练,所以改用假導(dǎo)航欄的透明度)
設(shè)置頭部圖片的Frame要注意,origin值不要改變一旦改變不好調(diào)整在讶。

#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //拿到偏移量
    CGFloat offsetY = scrollView.contentOffset.y;
    NSInteger headImvH = kScreenW / 320 * 300 ;
    CGFloat offset = headImvH + offsetY;//計(jì)算偏移量
    
    //設(shè)置導(dǎo)航欄
    self.navView.alpha = (offset / 250);
    if (self.navView.alpha >=1) {
        self.navView.alpha = 1;
    }
    //設(shè)置標(biāo)題文字 設(shè)置距離
    //alpha 0-->1 y 64-->20
    self.titLab.y = 64 - 44 * self.navView.alpha;
    
    //設(shè)置頭部圖片大小
    self.headImv.frame = CGRectMake(0, 0, kScreenW, headImvH-offset);   
}

附上結(jié)構(gòu)圖

最開始
上滑一半
上滑完成
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煞抬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子构哺,更是在濱河造成了極大的恐慌革答,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遮婶,死亡現(xiàn)場離奇詭異蝗碎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旗扑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門蹦骑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人臀防,你說我怎么就攤上這事眠菇。” “怎么了袱衷?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵捎废,是天一觀的道長。 經(jīng)常有香客問我致燥,道長登疗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任嫌蚤,我火速辦了婚禮辐益,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脱吱。我一直安慰自己智政,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布箱蝠。 她就那樣靜靜地躺著续捂,像睡著了一般垦垂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牙瓢,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天劫拗,我揣著相機(jī)與錄音,去河邊找鬼一罩。 笑死杨幼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聂渊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼四瘫,長吁一口氣:“原來是場噩夢啊……” “哼汉嗽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起找蜜,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饼暑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洗做,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弓叛,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年诚纸,在試婚紗的時候發(fā)現(xiàn)自己被綠了撰筷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡畦徘,死狀恐怖毕籽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情井辆,我是刑警寧澤关筒,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站杯缺,受9級特大地震影響蒸播,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萍肆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一袍榆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧匾鸥,春花似錦蜡塌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳曹。三九已至,卻和暖如春琅摩,著一層夾襖步出監(jiān)牢的瞬間铁孵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工房资, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜕劝,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓轰异,卻偏偏與公主長得像岖沛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搭独,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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