转自: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;
}
|
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]; } }