阅读 140

仿知乎拖动广告的实现iOS

Demo传送门:75亿💲的GitHub

实现过程

错误方向

一开始打算在使用tableview的cell中加载scrollview实现,然后发现非常吃内存,而且无法实时变化,背景图片每次在拖动结束后才会改变,尽管方法实现在scrollViewDidScroll内,依然毫无卵用,遂毙了

正确方向-目前

将图片设置在self.view上后添加tableview

    self.bkimv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"001"]];
    
    self.originalHeight = self.bkimv.bounds.size.height*(ScreenWidth*IMAGESCALE/self.bkimv.bounds.size.width);
    self.originalWidth = ScreenWidth*IMAGESCALE;
    
    self.bkimv.bounds = CGRectMake(0, 0, self.originalWidth, self.originalHeight);复制代码
    self.table.backgroundColor = [UIColor clearColor];
    [self.view addSubview:self.table];复制代码

给予作为广告的cell一个背景色透明,使该cell能够显示图片

///根据编辑状态变化
    if (model.isShow) {
        self.contentView.backgroundColor = [UIColor clearColor];
        self.nameLabel.text = @"";
    }else {
        self.contentView.backgroundColor = [UIColor whiteColor];
        self.nameLabel.text = model.name;
    }
复制代码

scrollViewDidScroll内实现图片位置的计算

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat w = self.originalWidth;//图片宽度
    CGFloat h = self.originalHeight;//图片高度
    CGFloat x = ScreenWidth/2;//中心点x坐标
    CGFloat y = scrollView.contentOffset.y/2+self.originalHeight/3;//中心点y坐标
    CGFloat scale = 1;//图片移动时比例变化率
    if (ISSETSCALE) {
        scale = (1-scrollView.contentOffset.y/ScreenHeight);
    }
    
    NSIndexPath *path= [NSIndexPath indexPathForRow:8 inSection:0];
    CGRect rectInTableView = [self.table rectForRowAtIndexPath:path];
    CGRect rectInSuperview = [self.table convertRect:rectInTableView toView:[self.table superview]];
    //cell相对于屏幕位置
    
    NSLog(@"%f %f %f",scale, y , rectInSuperview.origin.y);
    
    self.bkimv.center = CGPointMake(x, y);
    if (rectInSuperview.origin.y <= (y-h*scale/2)) {
        //广告cell到达图片最上部时使图片与cell同时移动
        self.bkimv.center = CGPointMake(x, rectInSuperview.origin.y+h*scale/2);
    } else if ((rectInSuperview.origin.y + ADCellHeight) >= (y+h*scale/2)) {
        //广告cell到达图片最底部时使图片与cell同时移动
        self.bkimv.center = CGPointMake(x, (rectInSuperview.origin.y + ADCellHeight)-h*scale/2);
    } else {
        self.bkimv.bounds = CGRectMake(0, 0, w*scale, h*scale);
    }
}复制代码

OVER

顺便图片暴露死宅属性

不说了我的肥宅快乐水快没气了