有关UIScrollView zoom的一点心得
2016-04-06 17:09
169 查看
实现UIScrollView的缩放,必须使maximumZoomScale(默认1.0)和minimumZoomScale(默认1.0)不同
,并且需要在delegate中的viewForZoomingInScrollView: 方法中返回需要所放的view。实现以上即可进行缩放。
要修改缩放过程中的一些行为,可以修该delegate中的scrollViewWillBeginZooming:withView: 和scrollViewDidZoom:(此方法为每次拖动时随时调用)和scrollViewDidEndZooming:withView:atScale:(此方法为每次放缩完毕时调用)的函数内容。
注意:
viewForZoomingInScrollView方法返回的view是scrollview确定contentsize的view。contentsize的大小与该view的frame.size相同;在放缩的同时scrollview会自动设定zoomscale属性的大小,与每次放缩结束的scrollViewDidEndZooming:withView:atScale
中的scale相同。每次放缩过程中,所放缩的view的bound不会改变而frame会改变(这同修改view的transform属性的效果相同)放缩会改变frame,改变view在父视图的位置,而不会改变bound大小。推测放缩也是通过affinetransform进行改变。所以对需要固定位置的view,需要在每次scrollViewDidZoom中修改view的位置,例如如下代码实现固定ImageView始终在整个content的居中位置:
-(void)scrollViewDidZoom:(UIScrollView *)scrollView{
CGFloat xcenter = scrollView.center.x , ycenter = scrollView.center.y;
//目前contentsize的width是否大于原scrollview的contentsize,如果大于,设置imageview中心x点为contentsize的一半,以固定imageview在该contentsize中心。如果不大于说明图像的宽还没有超出屏幕范围,可继续让中心x点为屏幕中点,此种情况确保图像在屏幕中心。
xcenter = scrollView.contentSize.width > scrollView.frame.size.width ?
\
scrollView.contentSize.width/2 : xcenter;
//同上,此处修改y值
ycenter = scrollView.contentSize.height > scrollView.frame.size.height ?
\
scrollView.contentSize.height/2 : ycenter;
[[scrollView viewWithTag:imageview] setCenter:CGPointMake(xcenter,
ycenter)];
}
设置scrollview的bouncesZoom属性可以确保view的放缩比例超出设置比例范围时自动进行反弹。
使图片自适应屏幕大小,以确保图片在屏幕正中的方法:
float x_scale = scrollView.frame.size.width/selectedImage.size.width;
float y_scale = scrollView.frame.size.height/selectedImage.size.height;
CGFloat scale = x_scale < y_scale ? x_scale : y_scale;
imageView.transform = CGAffineTransformMakeScale(scale, scale);
,并且需要在delegate中的viewForZoomingInScrollView: 方法中返回需要所放的view。实现以上即可进行缩放。
要修改缩放过程中的一些行为,可以修该delegate中的scrollViewWillBeginZooming:withView: 和scrollViewDidZoom:(此方法为每次拖动时随时调用)和scrollViewDidEndZooming:withView:atScale:(此方法为每次放缩完毕时调用)的函数内容。
注意:
viewForZoomingInScrollView方法返回的view是scrollview确定contentsize的view。contentsize的大小与该view的frame.size相同;在放缩的同时scrollview会自动设定zoomscale属性的大小,与每次放缩结束的scrollViewDidEndZooming:withView:atScale
中的scale相同。每次放缩过程中,所放缩的view的bound不会改变而frame会改变(这同修改view的transform属性的效果相同)放缩会改变frame,改变view在父视图的位置,而不会改变bound大小。推测放缩也是通过affinetransform进行改变。所以对需要固定位置的view,需要在每次scrollViewDidZoom中修改view的位置,例如如下代码实现固定ImageView始终在整个content的居中位置:
-(void)scrollViewDidZoom:(UIScrollView *)scrollView{
CGFloat xcenter = scrollView.center.x , ycenter = scrollView.center.y;
//目前contentsize的width是否大于原scrollview的contentsize,如果大于,设置imageview中心x点为contentsize的一半,以固定imageview在该contentsize中心。如果不大于说明图像的宽还没有超出屏幕范围,可继续让中心x点为屏幕中点,此种情况确保图像在屏幕中心。
xcenter = scrollView.contentSize.width > scrollView.frame.size.width ?
\
scrollView.contentSize.width/2 : xcenter;
//同上,此处修改y值
ycenter = scrollView.contentSize.height > scrollView.frame.size.height ?
\
scrollView.contentSize.height/2 : ycenter;
[[scrollView viewWithTag:imageview] setCenter:CGPointMake(xcenter,
ycenter)];
}
设置scrollview的bouncesZoom属性可以确保view的放缩比例超出设置比例范围时自动进行反弹。
使图片自适应屏幕大小,以确保图片在屏幕正中的方法:
float x_scale = scrollView.frame.size.width/selectedImage.size.width;
float y_scale = scrollView.frame.size.height/selectedImage.size.height;
CGFloat scale = x_scale < y_scale ? x_scale : y_scale;
imageView.transform = CGAffineTransformMakeScale(scale, scale);
相关文章推荐
- 手动模仿Qt5创建GUI程序过程记录
- 2016..4.06 点菜系统案例:利用文本框的inputView和inputAccessoryView串联UIPickerView、UIDateP...
- Android UI基础——Toast控件
- 超赞干货!一个完整的UI设计流程是怎样的?
- druid 配置
- EasyUI改动DateBox和DateTimeBox的默认日期格式
- 限制一个UITextField的输入长度
- 利用KVO实现 UITextView 通过代码方式设置内容后,自动滚动到最后一行
- UI控件--Notification
- 如何创建一个UICollectionView之使用详解
- 如何从uiwindow移除指定视图
- UIView动画
- 获取唯一UUID/UDID的方案
- 当uitextview 或uitextfield 含有 表情符号 emoji 时 使用 NSMakeRange 可能会出现得异常!
- UGUI-Canvas
- 虚幻4学习---UE4中的字符串转换
- 太原UI设计师告你UI设计中广告(banner)设计流程
- UESTC 890 Card Trick(DP 纸牌魔术)
- getRequestDispatcher 与 sendRedirect 的区别
- 【转载】微软Build大会10大重磅消息:聚焦人工智能