scrollView实现图⽚的缩⼩放⼤
啰嗦在前⾯:
之前实现view的放⼤缩⼩的时候是使⽤⼿势,然后通过改变
transform
或者
frame
来实现,最近抽空看了下使⽤
scrollView
的实现⽅式
⽀持pinch⼿势
Tosupportzooming,egateobjectmustconformtothe
cas,thedelegatewillbethescrollview’
delegateclassmustimplementtheviewForZoomingInScrollView:methodandreturntheviewtozoom.
⼤致意思就是,是如果⽀持缩放必须设置
scrollView
的代理,该代理类必须实现
viewForZoomingInScrollView:
⽅法,以返回⼀个view进⾏缩放;
下⾯这段代码就返回了⼀个imageView来进⾏缩放
-(UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView
{
iew;
}
要指定⽤户可以缩放的数量,可以设置
minimumZoomScale
和
maximumZoomScale
属性的值,这两个值最初都设置为1.0
-(void)viewDidLoad{
[superviewDidLoad];
mZoomScale=0.5;
mZoomScale=6.0;
tSize=CGSizeMake(1280,960);
te=lf;
[ViewaddSubview:_imageView];
}
这样我们就实现了imageView的⼀个缩放效果,
需要注意的是:如果想要通过捏合⼿势来进⾏缩放,那⾄少要指定缩放因⼦(minimumZoomScale和maximumZoomScale,值不能
相同)和实现viewForZoomingInScrollView:代理⽅法
以编程⽅式缩放
scrollView
可能需要响应于诸如双击或其他轻击⼿势之类的触摸事件或者响应于除了捏合⼿势之外的其他⽤户动作⽽放⼤。为了做到这⼀
点,UIScrollView提供了两种⽅法的实现:
tZoomScale:animated:
和
zoomToRect:animated:
。
mScale:animated:
1.
tZoomScale:animated:
通过设置当前缩放⽐例为指定的值来缩放。该值必须是在
minimumZoomScale
和
maximumZoomScale
范围
内。
animated
指定是否有动画。也可以直接设置scrollView的
zoomScale
属性,直接设置属性就相当于时
animated
为NO
的
tZoomScale:animated:
⽅法;
2.通过该⽅法或者直接改变
zoomScale
属性缩放视图时,视图的位置(
origin
)保持不变
-(IBAction)zoom:(id)nder{
if(ale>mZoomScale){//已经放⼤现在缩⼩
[ewtZoomScale:mZoomScaleanimated:YES];
}
el{
[ewtZoomScale:mZoomScaleanimated:YES];
}
NSLog(@":%@imageVieworigin:%@",NSStringFromCGPoint(),NSStringFromCGPoint());
}
效果为
控制台的打印信息为
:{207,368}imageVieworigin:{138,245.33333333333331}
:{276,490.66666666666663}imageVieworigin:{138,245.33333333333329}
可以看到,imageView的origin是没有改变的
Rect:animated:
Zoomstoaspecificareaofthecontentsothatitisvisibleinthereceiver.
放⼤到内容的特定区域,以便在receiver中可见。
参数解释:
rect:tangleshouldbeinthecoordinatespaceof
theviewreturnedbyviewForZoomingInScrollView:.
定义内容视图区域的矩形。矩形应该位于viewForZoomingInScrollView:返回的视图的坐标空间中
animated:YESifthescrollingshouldbeanimated,NOifitshouldbeimmediate.
animated参数决定了位置和缩放的变化是否会导致动画发⽣
苹果官⽅提供了⼀个⽰例,
/**
该⽅法返回的矩形适合传递给zoomToRect:animated:⽅法。
@paramscrollViewUIScrollView实例
@paramscale新的缩放⽐例(通常zoomScale通过添加或乘以缩放量⽽从现有的缩放⽐例派⽣⽽来)
@paramcenter放⼤缩⼩的中⼼点
@returnzoomRect是以内容视图为坐标系
*/
-(CGRect)zoomRectForScrollView:(UIScrollView*)scrollViewwithScale:(float)scalewithCenter:(CGPoint)center{
CGRectzoomRect;
//Thezoomrectisinthecontentview'scoordinates.
//Atazoomscaleof1.0,itwouldbethesizeofthe
//imageScrollView'sbounds.
//Asthezoomscaledecreas,somorecontentisvisible,
//thesizeoftherectgrows.
=/scale;
=/scale;
//chooanoriginsoastogettherightcenter.
.x=center.x-(/2.0);
.y=center.y-(/2.0);
returnzoomRect;
}
当⽤户完成缩放⼿势或通过代码完成缩放时,会触发
scrollViewDidEndZooming:withView:atScale:
代理事件。
通过点击进⾏缩放
Inorderforyourapplicationtosupporttaptozoomfunctionality,youdonotneedtosubclass
dyouimplementtherequiredtouchhandlingintheclassforwhich
theUIScrollViewdelegatemethodviewForZoomingInScrollView:asswillberesponsiblefortrackingthe
detectsasingletap,adoubletap,oratwo-
fingertouch,aofthedoubletapandtwo-fingertouch,itshould
programmaticallyzoomthescrollviewbytheappropriatefactor.
⼤致翻译:
为了让您的应⽤程序⽀持点击缩放功能,您不需要继承UIScrollView该类。⽽是在UIScrollView委托⽅法
viewForZoomingInScrollView:返回的类中实现所需的触摸处理。该类将负责跟踪屏幕上的⼿指数量和点击次数。当它
检测到单击,双击或双指触摸时,它将作出相应的响应。在双击和双指触摸的情况下,应该以适当的因⼦以编程⽅式缩放
scrollView
实现⼀个简单的图⽚放⼤缩⼩查看功能
浏览.gif
主要有两部分:
和dismiss时的过渡动画
2.图⽚的放⼤缩⼩
以上⾯的效果图为例,我这⾥是通过⼀个view来实现,在view中添加⼀个
scrollView
,
scrollView
上添加⼀个
imageView
来显⽰图⽚,并作
为
viewForZoomingInScrollView:
的返回view。
.h
⽂件
-(instancetype)initWithOriginImage:(UIImage*)originImagehighlightedImage:(UIImage*)highlightedImagefromRect:(CGRect)fromRect;
-(void)show;
-(void)dismiss;
在初始化的时候传⼊⼀个普通图⽚和⼀个⾼清图⽚,以及图⽚所在视图(UIImageView或UIButton等)的frame;
动画显⽰图⽚
-(void)showOriginImageWithAnimation
{
=ct;
if(Image){
CGRectfinalRect=[lfgetScaledFinalFrame];
if(>getViewHeight(View)){
tSize=CGSizeMake(getViewWidth(View),);
}
=0.f;
=Image;
[UIViewanimateWithDuration:_animationDurationanimations:^{
=finalRect;
=1.f;
}completion:^(BOOLfinished){
if(ghtedImage){
=ghtedImage;
}
}];
}
el{
=;
=0;
if(ghtedImage){
=ghtedImage;
}
[UIViewanimateWithDuration:_animationDurationanimations:^{
=1.f;
}completion:nil];
}
}
双击⼿势,实现图⽚的缩⼩和放⼤
-(void)doubleTapGesture:(UITapGestureRecognizer*)tap
{
if(ale>_minimumZoomScale){//已经放⼤现在缩⼩
[ViewtZoomScale:_minimumZoomScaleanimated:YES];
}
el{
//已经缩⼩现在放⼤
CGPointpoint=[taplocationInView:View];
//[lfzoomScrollView:ViewtoPoint:pointwithScale:_maximumZoomScaleanimated:YES];
//⽅法⼀以point为中⼼点进⾏放⼤
CGRectzoomRect=[lfzoomRectForScrollView:ViewwithScale:_maximumZoomScalewithCenter:point];
[ViewzoomToRect:zoomRectanimated:YES];
//⽅法⼆也可以通过这种⽅法来放⼤这种是直接放⼤以scrollView的中⼼点
//[ViewtZoomScale:_maximumZoomScaleanimated:YES];
}
}
消失动画也是单击时调⽤的⽅法
-(void)dismiss
{
CGRectframe=ct;
CGFloatoriginX=tOfft.x+.x;
CGFloatoriginY=tOfft.y+.y;
=CGPointMake(originX,originY);
[UIViewanimateWithDuration:_animationDurationanimations:^{
=frame;
=0.f;
}completion:^(BOOLfinished){
[lfremoveFromSuperview];
}];
}
当然别忘了实现
scrollView
的代理⽅法
返回
imageView
作为缩放视图
-(UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView
{
iew;
}
缩放view的时候调整
imageView
的位置
//anyzoomscalechanges
-(void)scrollViewDidZoom:(UIScrollView*)scrollView
{
CGFloatscrollW=CGRectGetWidth();
CGFloatscrollH=CGRectGetHeight();
CGSizecontentSize=tSize;
CGFloatofftX=scrollW>?()*0.5:0;
CGFloatofftY=scrollH>?()*0.5:0;
CGFloatcenterX=*0.5+offtX;
CGFloatcenterY=*0.5+offtY;
=CGPointMake(centerX,centerY);
}
本文发布于:2022-11-25 04:02:16,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/16183.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |