顶部图片随UITableView或UIScrollerView滑动缩放效果实现

UITableView示范例子:
#import "ProfileViewController.h"

static CGFloat ImageHeight = 150.0;
static CGFloat ImageWidth = 320.0;

@interface ProfileViewController ()

@end

@implementation ProfileViewController

- (void)updateImg {
CGFloat yOffset = _tableView.contentOffset.y;
if (yOffset < 0) {
CGFloat factor = ((ABS(yOffset)+ImageHeight)*ImageWidth)/ImageHeight;
CGRect f = CGRectMake(-(factor-ImageWidth)/2, 64, factor, ImageHeight+ABS(yOffset));
self.imgProfile.frame = f;
} else {
CGRect f = self.imgProfile.frame;
f.origin.y = -yOffset+64;
self.imgProfile.frame = f;
}
}

#pragma mark - Table View Delegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self updateImg];
}

#pragma mark - Table View Datasource

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section == 0)
return 1;
else
return 12;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0)
return ImageHeight;
else
return 44.0;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellReuseIdentifier = @"SectionTwoCell";
NSString *windowReuseIdentifier = @"SectionOneCell";
UITableViewCell *cell = nil;
if (indexPath.section == 0) {
cell = [tableView dequeueReusableCellWithIdentifier:windowReuseIdentifier];
if (!cell) {

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:windowReuseIdentifier];
cell.backgroundColor=[UIColor clearColor];
}
} else {
cell = [tableView dequeueReusableCellWithIdentifier:cellReuseIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellReuseIdentifier];
cell.contentView.backgroundColor = [UIColor lightGrayColor];

}
cell.textLabel.text = [ NSString stringWithFormat:@"cell %li",(long)indexPath.row];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}

- (id)init
{
self = [super init];
if (self) {
// Custom initialization
UIImage *image = [UIImage imageNamed:@"bg.png"];
self.imgProfile = [[UIImageView alloc] initWithImage:image];
self.imgProfile.frame = CGRectMake(0, 64, ImageWidth, ImageHeight);

CGRect bounds = self.view.bounds;
self.tableView = [[UITableView alloc] init];
self.tableView.dataSource = self;
self.tableView.delegate = self;
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
self.tableView.backgroundColor = [UIColor clearColor];
self.tableView.frame = CGRectMake(0, 64, bounds.size.width, bounds.size.height-64);;

[self.view addSubview:self.imgProfile];
[self.view addSubview:self.tableView];

self.title = @"with UITableView";
}
return self;
}
#pragma mark - notes
/*
原理:
其实是利用了图层叠交层次,与设置UITableView背景透明,不同sections中或只有一个section下的cell选择性设置不透明,
再在scrollview的滚动代理方法中计算对图片缩放
init中:
初始化一个UIImageView并设置相应属性
初始化一个UITableView并设置相应属性重点设置该tableview的backgroundColor为clearColor
viewController中的view添加UIImageView和UITableView(注意:UIImageView是添加到viewController的view上而不是UITableView中的cell)

scrollView滚动的时候:
CGFloat yOffset = _tableView.contentOffset.y;
if (yOffset < 0) {
CGFloat factor = ((ABS(yOffset)+ImageHeight)*ImageWidth)/ImageHeight;
CGRect f = CGRectMake(-(factor-ImageWidth)/2, 64, factor, ImageHeight+ABS(yOffset));
self.imgProfile.frame = f;
} else {
CGRect f = self.imgProfile.frame;
f.origin.y = -yOffset+64;
self.imgProfile.frame = f;
}
tableView设置两个sections(可选,如果想默认显示一部分或全部图片,可把第一个section的cell设置背景透明)
第一个section设置一个cell用于设置cell透明显示背面的图片
第二个section开始正常显示数据
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath:
方法设置cell的高度:
控制显示背后的图片多高
其它数据cell正常设置
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath :
方法设置cell信息:
生成两个表视图单元可复用字符串标识符
一个用于正常数据cell
一个用于显示背后图片表视图单元
根据section生成对应cell返回
*/
@end

UIScrollView示范例子:
#import "ProfileScrollViewController.h"

static CGFloat ImageHeight = 150.0;
static CGFloat ImageWidth = 320.0;

@interface ProfileScrollViewController ()

@end

@implementation ProfileScrollViewController

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat yOffset = self.scrollView.contentOffset.y;

if (yOffset < 0) {
CGFloat factor = ((ABS(yOffset)+ImageHeight)*ImageWidth)/ImageHeight;
CGRect f = CGRectMake(-(factor-ImageWidth)/2, 64, factor, ImageHeight+ABS(yOffset));
self.imgProfile.frame = f;
} else {
CGRect f = self.imgProfile.frame;
f.origin.y = -yOffset+64;
self.imgProfile.frame = f;
}
}

#pragma mark - View lifecycle

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
UIImage *image = [UIImage imageNamed:@"bg.png"];
self.imgProfile = [[UIImageView alloc] initWithImage:image];
self.imgProfile.frame = CGRectMake(0, 64, ImageWidth, ImageHeight);

UIView *contentView=[[UIView alloc]initWithFrame:CGRectMake(0, ImageHeight+64, self.view.frame.size.width, 600)];
contentView.backgroundColor=[UIColor groupTableViewBackgroundColor];

CGRect bounds = self.view.bounds;
self.scrollView = [[UIScrollView alloc] init];
self.scrollView.delegate = self;
self.scrollView.backgroundColor = [UIColor clearColor];//重点
self.scrollView.contentSize = CGSizeMake(320, contentView.frame.size.height+ImageHeight+64);
[self.scrollView addSubview:contentView];
self.scrollView.frame = bounds;
[self.view addSubview:self.imgProfile];
[self.view addSubview:self.scrollView];

self.title = @"with UIScrollView";

}
return self;
}
#pragma mark - notes
/*
原理:
其实是利用了图层叠交层次,与设置UIScrollView背景透明,再在UIScrollView上添加不透明的内容View,该内容View的Y坐标在图片的下面
再在scrollview的滚动代理方法中计算对图片缩放
init中:
初始化一个UIImageView并设置相应属性
初始化一个UIScrollView并设置相应属性重点设置该UIScrollView的backgroundColor为clearColor,并且添加一个不透明的内容view在图片下部
viewController中的view添加UIImageView和UIScrollView(注意:UIImageView是添加到viewController的view上而不是UIScrollView中)
scrollView滚动的时候:
CGFloat yOffset = _tableView.contentOffset.y;
if (yOffset < 0) {
CGFloat factor = ((ABS(yOffset)+ImageHeight)*ImageWidth)/ImageHeight;
CGRect f = CGRectMake(-(factor-ImageWidth)/2, 64, factor, ImageHeight+ABS(yOffset));
self.imgProfile.frame = f;
} else {
CGRect f = self.imgProfile.frame;
f.origin.y = -yOffset+64;
self.imgProfile.frame = f;
}
*/
@end

时间: 2024-10-09 14:26:01

顶部图片随UITableView或UIScrollerView滑动缩放效果实现的相关文章

iOS开发-UITableView顶部图片下拉放大

关于顶部图片下拉放大,在用户展示的个人中心显示用户个人头像信息,设置UITableView的headerView实现,UITableView继承自UIScrollView,同样的设置UIScrollView的顶部图片也可以实现同样的效果,简单看一下实现的效果: 控制器中设置需要的属性变量: @property (strong,nonatomic) UITableView *tableView; @property (strong,nonatomic) NSArray *data; @proper

jQuery实现的图片等比例缩放效果

jQuery实现的图片等比例缩放效果:如果一个容器中放一个比容器还要大的图,那就可能就造成布局出现问题,就算是不容器大,有时候也看起来不够美观,这时候就要限制图片的尺寸,当然不能变形,否则就难看了,下面就介绍一下如何使用jQuery实现等比例缩放效果.代码如下: <div id="demo"> <img src="a.jpg" width="800" height="300" alt="图片&quo

一种支持任意尺寸的图片滑动(上下左右滑动)效果

<! DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>任意尺寸的图片滑动</title> <style> div { margin: 0 auto; overflow: hidden;} .main { width: 100

图片工具类, 图片水印,文字水印,缩放,补白等

import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import

手机端图片滑动切换效果

最近公司要求开发wap版本页面,碰到了个图片滑动切换效果,折腾了半天,自己封装了一个比较通用的小控件,在此分享一下. 大概功能:可以自定义是否自动切换,支持单手滑动图片进行切换,支持左右滑动切换.循环切换等等,具体可以拿demo代码自己本地试试,注意只支持手机端哦 大概思路:通过touchstart.touchmove.touchend 三个事件加上css3的3d变化效果配合,实现滑动切换图片, 开发是基于Zepto框架,当然也支持其他任何一款手机端框架,只需将代码中的美元符号$换为指定框架操作

delphi GDI 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法

delphi 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法 若有更好的,请大神留言我也学习下,感谢! uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var  Bitmap1: TGPBitmap;  Bitmap2: TBitmap;  Graphic: TGPGraphics;begin  Bitmap1 := TGPBitmap.Create('test.bmp');  // bmp, gif, jpeg, png...  Bitmap2 := TBit

java实现的图片缩放 压缩 裁剪工具!找了很久,市面上再也找不到比它缩放效果还好的代码了

原文:java实现的图片缩放 压缩 裁剪工具!找了很久,市面上再也找不到比它缩放效果还好的代码了 源代码下载地址:http://www.zuidaima.com/share/1550463380458496.htm 纯 java 实现的 图片缩放 压缩 裁剪工具!不依赖任何第三方 jar 包 1. 找了很久,市面上再也找不到比它缩放效果还好的代码了 (再不使用任何第三方组件的前提下) 2. 支持缩放 3. 支持剪切 (例如:用户上传头像后剪切成正方形小图) /* * Copyright 2012

Discuz升级!图片查看插件(支持鼠标缩放、实际大小、旋转、下载)

图片查看是网站中的常用功能,用于展示详细的图片.在discuz图片插件的基础上进行了改造,因此这篇文章主要从以下几个方面来讨论图片查看插件.希望可以帮助到大家,有不对的地方也欢迎大家给以正确的指导. (1)discuz的实现过程及效果 (2)discuz的局限性 (3)discuz的改进步骤 (4)兼容性及最后效果 (5)总结(常见问题) demo示例:http://zyk3.ataw.cn/discuz/index.html 一.discuz的实现过程及效果 点击图片,弹出层有大图,同时有在新

个人学习JQ插件编写成果:little酷炫的图片滑动切换效果

工作一个多月了,好久没来冒冒泡了,看了@wayong的JQ插件教程,自己编写了一个模仿拉勾网首页广告栏滑动特效的JQ插件,现在跟朋友们分享分享! 先上demo链接:http://runjs.cn/detail/gpowdhhk 快要下班了~先把代码放出来~~回家再编辑~ 这里是HTML代码: 1 <!--js酷炫图片滑动hover效果,类似拉勾网--> 2 <div class="beauty-go-outer" id="my-div"> 3