微博头视图下拉放大效果 tableview头视图下拉放大效果

35 篇文章 0 订阅
33 篇文章 0 订阅


转自:http://www.oschina.net/code/snippet_2248391_50894


1. [代码]微博头视图下拉放大效果 tableview头视图下拉放大效果     

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#import "TableViewController.h"
 
@interface TableViewController ()
{
     UIView *_headerView;
     UIImageView *imagee;
}
@end
 
@implementation TableViewController
 
- ( void )viewDidLoad {
     [ super viewDidLoad];
     _headerView = [[ UIView alloc]initWithFrame:CGRectMake(0, 0, [[ UIScreen mainScreen] bounds].size.width, 200)];
     UIImage *image = [ UIImage imageNamed:@ "1" ];
    imagee = [[ UIImageView alloc]initWithFrame:CGRectMake(([[ UIScreen mainScreen] bounds].size.width / 2) - 40 , 25, 80, 80)];
     imagee.image = image;
     [_headerView addSubview:imagee];
     self .tableView.tableHeaderView = _headerView;
}
 
- ( void )didReceiveMemoryWarning {
     [ super didReceiveMemoryWarning];
     // Dispose of any resources that can be recreated.
}
- ( void )scrollViewDidScroll:( UIScrollView *)scrollView{
     CGFloat yOffset = self .tableView.contentOffset.y;
     //向上偏移量变正  向下偏移量变负
     if (yOffset < -64) {
         CGFloat factor = ABS(yOffset)+200-64;
         CGRect f = CGRectMake(-([[ UIScreen mainScreen] bounds].size.width*factor/200-[[ UIScreen mainScreen] bounds].size.width)/2,-ABS(yOffset)+64, [[ UIScreen mainScreen] bounds].size.width*factor/200, factor);
         imagee.frame = f;
     } else {
         CGRect f = _headerView.frame;
         f.origin.y = 0;
         _headerView.frame = f;
         imagee.frame = CGRectMake(0, f.origin.y, [[ UIScreen mainScreen] bounds].size.width, 200);
     }
}
#pragma mark - Table view data source
 
- ( NSInteger )numberOfSectionsInTableView:( UITableView *)tableView {
#warning Potentially incomplete method implementation.
     // Return the number of sections.
     return 0;
}
 
- ( NSInteger )tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section {
#warning Incomplete method implementation.
     // Return the number of rows in the section.
     return 0;
}

2. [图片] 5EF61941-405D-4714-B54E-92E6F6A000FF.png    

3. [图片] 8F7701BD-6E79-4022-B06C-A228FFABFB56.png    



//*****************************************************
例子2:
转自:http://www.cnblogs.com/JackieHoo/p/5119696.html

首页是一个头部图片可以拉伸放大缩小效果的tableViewHeader。具体效果如图:

  如果这个效果是想要学习的可以去这里下载我的demo:http://pan.baidu.com/s/1qXeFR0g

  开发这类效果的TableViewHeader一般是通过监听scrollViewDidScroll:代理方法知道contenOffset值的变化,从而通过这个值的变化调整头部背景图的大小或者其他图片的大小(如本例子的头像视图)。

  重点代码如下:

复制代码
- (void)updateSubViewsWithScrollOffset:(CGPoint)newOffset {
    CGFloat destinaOffset = -64;
    CGFloat startChangeOffset = -self.scrollView.contentInset.top;
    newOffset = CGPointMake(newOffset.x, newOffset.y < startChangeOffset ? startChangeOffset : (newOffset.y > destinaOffset ? destinaOffset : newOffset.y));
    
    CGFloat subviewOffset = self.frame.size.height-40; // 子视图的偏移量
    CGFloat newY = -newOffset.y-self.scrollView.contentInset.top;
    CGFloat d = destinaOffset-startChangeOffset;
    CGFloat alpha = 1-(newOffset.y-startChangeOffset)/d;
    CGFloat imageReduce = 1-(newOffset.y-startChangeOffset)/(d*2);
    self.subTitleLabel.alpha = alpha;
    self.titleLabel.alpha = alpha;
    self.frame = CGRectMake(0, newY, self.frame.size.width, self.frame.size.height);
    self.backImageView.frame = CGRectMake(0, -0.5*self.frame.size.height+(1.5*self.frame.size.height-64)*(1-alpha), self.backImageView.frame.size.width, self.backImageView.frame.size.height);
    
    CGAffineTransform t = CGAffineTransformMakeTranslation(0,(subviewOffset-0.35*self.frame.size.height)*(1-alpha));
    _headerImageView.transform = CGAffineTransformScale(t,
                                                        imageReduce, imageReduce);
    
    self.titleLabel.frame = CGRectMake(0, 0.6*self.frame.size.height+(subviewOffset-0.45*self.frame.size.height)*(1-alpha), self.frame.size.width, self.frame.size.height*0.2);
    self.subTitleLabel.frame = CGRectMake(0, 0.75*self.frame.size.height+(subviewOffset-0.45*self.frame.size.height)*(1-alpha), self.frame.size.width, self.frame.size.height*0.1);
    

}
复制代码

  在我这个demo中我没有通过代理方法scrollViewDidScroll:获取contenOffset的值,而是用kvo观察contenOffset值的变化然后调用上面这个方法达到效果,效果和通过scrollViewDidScroll:代理方法是一样的。

复制代码
- (void)willMoveToSuperview:(UIView *)newSuperview {
    [self.scrollView addObserver:self forKeyPath:@"contentOffset" options:(NSKeyValueObservingOptionNew) context:Nil];
    self.scrollView.contentInset = UIEdgeInsetsMake(self.frame.size.height, 0, 0, 0);
    self.scrollView.scrollIndicatorInsets = self.scrollView.contentInset;//滚动条的位置
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"contentOffset"]) {
    
        CGPoint newOffset = [change[@"new"] CGPointValue];
        [self updateSubViewsWithScrollOffset:newOffset];
    }
}
复制代码

  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值