UITableView 視差效果

之前在項目中用過一個視差效果蜗帜,其實實現(xiàn)并不是很難来惧,我們先看一下效果 </br>

視差效果.gif
大概說一下思路:</br>

每個cell中有一個UIImageView洽蛀,在tableview向上滑動的時候耙蔑,cell中的imageview相對cell向下移動结序,形成一個視差效果。也就是說纵潦,除了屏幕最上端的cell中的imageview的y為0以外,下面的cell中的imageview的Y值均為負(fù)值垃环。

接下來就依照已知量來計算每個imageView的y值邀层,并且在tableview滾動的時候?qū)崟r更改imageView的Y值。

已知量:</br>

  1. tableView的高度(tableViewHeight)</br>
  2. tableView的偏移量</br>
  3. cell的高度</br>
  4. imageView的高度</br>
  5. cell的Y值
  6. cell相主屏幕的偏移量(cellOffset) -> cellY值 - tableView的偏移量</br>

求imageView的偏移量(imageViewOffset)遂庄。如下圖所示寥院。

圖解.png

思路:
當(dāng)cell的偏移量變?yōu)?的時候,imageViewY的值也由負(fù)值變?yōu)?涛目。</br>
imageViewY的最大值為 imageViewHeight - cellHeight秸谢。</br>
因此可得如下公式:</br>
cellOffset/tableViewHeight = imageViewOffset/(imageViewHeight - cellHeight);</br>
imageViewOffset = cellOffset/tableViewHeight * (imageViewHeight - cellHeight);

好了,啰嗦完了霹肝,上代碼:
新建一個工程估蹄,在工程中自定義一個cell,cell中放一個UIImageView控件,讓UIImageView控件的高度大于Cell的高度。我這里設(shè)置為300甜无;cell的高度設(shè)為200热凹;

并且增加兩個方法:

    // 獲取圖片最大偏移量
    - (CGFloat)imageOverflowHeight;
    // 重新設(shè)置圖片偏移量
    - (void)setImageOffset:(CGPoint)imageOffset族檬;

自定義cell.m中的代碼如下:

    -(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

        if (self) {
    
            _mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, [[UIScreen mainScreen] bounds].size.width , 300)];
    
            _mainImageView.contentMode = UIViewContentModeScaleAspectFill;
    
            [self.contentView addSubview:_mainImageView];
    
            _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 80, [UIScreen mainScreen].bounds.size.width, 40)];
    
            _titleLabel.backgroundColor = [UIColor colorWithRed:0.94 green:0.94 blue:0.94 alpha:0.50];
    
            _titleLabel.text = @"這是圖片上的文字";
    
            _titleLabel.textAlignment = 1;
    
            [self.contentView addSubview:_titleLabel];
        }

        return self;
    }

    /**
     *  返回圖片大于imageView的高度
     *
     *  @return 圖片大于imageView的高度
     */
    - (CGFloat)imageOverflowHeight
    {
        // 減200 是因為cell的高度設(shè)為200,所以直接寫固定值了
        return _mainImageView.frame.size.height - 200;
    }

    /**
     *  設(shè)置imageView偏移量
     *
     *  @param imageOffset 偏移量
     */
    - (void)setImageOffset:(CGPoint)imageOffset
    {
        CGRect frame = _mainImageView.frame;
        frame.origin = imageOffset;
        _mainImageView.frame = frame;
    }

在VC中添加一個tableview控件,工程中拖入一些圖片備用系枪。VC.m的代碼如下:

    @interface ViewController ()<UITableViewDelegate, UITableViewDataSource>
    @property (nonatomic, strong) NSMutableArray *sourceArr;
    @property (nonatomic, strong) UITableView *mainTable;
    @end

    @implementation ViewController

    - (void)viewDidLoad {
        [super viewDidLoad];

        _sourceArr = [NSMutableArray array];

        for (NSInteger i = 1; i <= 44; i++) {
    
               NSString *imageName = [NSString stringWithFormat:@"img%ld.jpg", i];
        
                [_sourceArr addObject:imageName];
    
        }

        _mainTable = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];

        _mainTable.delegate = self;

        _mainTable.dataSource = self;

        _mainTable.separatorStyle = UITableViewCellSeparatorStyleNone;

        [_mainTable registerClass:[LTParallaxCell class] forCellReuseIdentifier:@"cell"];

        [self.view addSubview:_mainTable];


    }

    /**
     *  設(shè)置imageView的偏移量
     *
     *  @param cell
     */
    - (void)updateImageViewCellOffset:(LTParallaxCell *)cell
    {
        // 獲取cell的偏移量
        CGFloat cellOffset = cell.frame.origin.y - self.mainTable.contentOffset.y;
        // 獲取imageView的最大偏移量
        CGFloat imgMaxHeight = [cell imageOverflowHeight];
        // 計算imageView新的偏移量
        CGFloat offset = 0.0f - imgMaxHeight * cellOffset / self.mainTable.frame.size.height;
        // 設(shè)置imageView新的偏移量
        [cell setImageOffset:CGPointMake(0.0f, offset)];

    }

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return [_sourceArr count];
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        LTParallaxCell *cell        = [tableView dequeueReusableCellWithIdentifier:@"cell"];

        cell.mainImageView.image    = [UIImage imageNamed:[_sourceArr objectAtIndex:indexPath.row]];

        cell.selectionStyle         = UITableViewCellSelectionStyleNone;

        cell.clipsToBounds          = YES;

        return cell;
    }

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 200;
    }

    #pragma mark - UIScrollViewdelegate methods

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        for (LTParallaxCell *cell in self.mainTable.visibleCells) {
            [self updateImageViewCellOffset:cell];
        }
    }

    #pragma mark - UITableViewDelegate

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self updateImageViewCellOffset:(LTParallaxCell *)cell];
    }

    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    @end

至此,一個視差效果就完成了磕谅,如果有什么錯誤的地方歡迎大家指正私爷。</br>
本人個人博客地址:http://www.lrymlt.cn/blog/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市怜庸,隨后出現(xiàn)的幾起案子当犯,更是在濱河造成了極大的恐慌,老刑警劉巖割疾,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚎卫,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拓诸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門侵佃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人奠支,你說我怎么就攤上這事馋辈。” “怎么了倍谜?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵迈螟,是天一觀的道長。 經(jīng)常有香客問我尔崔,道長答毫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任季春,我火速辦了婚禮洗搂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘载弄。我一直安慰自己耘拇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布宇攻。 她就那樣靜靜地躺著惫叛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尺碰。 梳的紋絲不亂的頭發(fā)上挣棕,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音亲桥,去河邊找鬼洛心。 笑死,一個胖子當(dāng)著我的面吹牛题篷,可吹牛的內(nèi)容都是我干的词身。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼番枚,長吁一口氣:“原來是場噩夢啊……” “哼法严!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起葫笼,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤深啤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后路星,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溯街,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了呈昔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挥等。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堤尾,靈堂內(nèi)的尸體忽然破棺而出肝劲,到底是詐尸還是另有隱情,我是刑警寧澤郭宝,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布辞槐,位于F島的核電站,受9級特大地震影響粘室,放射性物質(zhì)發(fā)生泄漏催蝗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一育特、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧先朦,春花似錦缰冤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至刺彩,卻和暖如春迷郑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背创倔。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工嗡害, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人畦攘。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓霸妹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親知押。 傳聞我的和親對象是個殘疾皇子叹螟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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

  • 1.nav1.navigationBar.barStyle=UIBarStyleBlack; //改變導(dǎo)航欄背景顏...
    SadMine閱讀 1,595評論 1 4
  • 關(guān)于tableView視差效果,我們來封裝一下台盯。 具體實現(xiàn)思路請看: http://www.reibang.com...
    徊家喂豬閱讀 372評論 0 2
  • 晚風(fēng)卷走八月的熱浪静盅, 九月帶著灑脫信步而來良价。 時光走筆,草木一秋, 八月再見棚壁,九月你好杯矩。 一簾風(fēng),一草黃袖外, 一葉知...
    流星落雨閱讀 328評論 0 0
  • 1. 我們稱之為愛的曼验,不過是年少沖動而已泌射。 但是現(xiàn)在的我很慶幸,還好當(dāng)初選擇了沖動鬓照,才讓我們有了后來的故事熔酷,成為人...
    何君故閱讀 1,680評論 1 4
  • 優(yōu)美媽媽在生優(yōu)美的時候難產(chǎn)死了,優(yōu)美可能知道媽媽死了出來的時候大哭豺裆,優(yōu)美媽媽當(dāng)時才二十八歲拒秘,優(yōu)美爸爸叫國強(qiáng)優(yōu)美出來...
    藍(lán)天白云白雪公主閱讀 276評論 5 0