iOS中UIScrollView嵌套UIImageView实现图片滑动浏览、缩放
来源:互联网 发布:php空间服务器 编辑:程序博客网 时间:2024/05/16 12:10
一开始的时候是UIScrollView直接嵌套UIImageView,滑动浏览都是正常的,但是不能伸缩,试了UIScrollVIew自身的zoom方法,也试用了pinch gesture的方法都无果,后来想到了用UIScrollView嵌套UIScrollVIew再嵌套UIImageView的方法实现,然后缩放用的是UIScrollView自身的缩放方法,成功,很棒。
载入图片是用的SDWebImage,提示框用的是MBProgressHUD
实现了在当前图片放大情况下,滑动到相邻的图片时对当前图片恢复到原始比例。以及缩小时保证图片在正中间。解决了滑动时显示多个“载入中”的BUG
以下是源码:(直接复制不能运行)
func showImages(theView:UIView,imageNamesTMP:[String]) { println("showImages") imageNames = imageNamesTMP var numberOfImages:CGFloat = (CGFloat)(imageNames.count) imageBigScrollView.contentSize = CGSizeMake(SCREENWIDTH * numberOfImages, SCREENHEIGHT) imageSmallScrollViews = NSMutableArray() for(var i = 0; i < (Int)(numberOfImages);i++) { var smallScrollView = UIScrollView(frame: CGRectMake(SCREENWIDTH * (CGFloat)(i), 0, SCREENWIDTH, SCREENHEIGHT)) smallScrollView.pagingEnabled = false smallScrollView.contentSize = CGSizeMake(SCREENWIDTH, SCREENHEIGHT) smallScrollView.delegate = self smallScrollView.showsHorizontalScrollIndicator = false smallScrollView.showsVerticalScrollIndicator = false smallScrollView.minimumZoomScale = 0.2 smallScrollView.maximumZoomScale = 8 imageBigScrollView.addSubview(smallScrollView) imageSmallScrollViews.addObject(smallScrollView) } var pageControlHeight:CGFloat = 20 imagePageControl = UIPageControl(frame: CGRectMake(0, SCREENHEIGHT - pageControlHeight, SCREENWIDTH, pageControlHeight)) theView.addSubview(imagePageControl) var longGesture = UILongPressGestureRecognizer(target: self, action: "longPressed:") imageBigScrollView.addGestureRecognizer(longGesture) imagePageControl.numberOfPages = (Int)(numberOfImages) imagePageControl.currentPage = 0 imagePageControl.backgroundColor = UIColor.clearColor() imagePageControl.hidesForSinglePage = true imagePageControl.defersCurrentPageDisplay = true needToZoomIndex = imagePageControl.currentPage imageViews = NSMutableArray() imageFlag = NSMutableArray() for(var i = 0; i < imageNames.count; i++) { imageViews.addObject(UIImageView()) imageFlag.addObject(0) } loadImageWithPage(0) loadImageWithPage(1) } func loadImageWithPage(page:Int) { if(page < 0 || page >= imageNames.count) { return } var flag = imageFlag.objectAtIndex(page) as Int var iView:UIImageView = imageViews.objectAtIndex(page) as UIImageView if(flag == 0) { var frame = self.imageBigScrollView.frame frame.origin.x = 0 frame.origin.y = 0 iView.userInteractionEnabled = true iView.frame = frame iView.contentMode = UIViewContentMode.ScaleAspectFit (self.imageSmallScrollViews.objectAtIndex(page) as UIScrollView).addSubview(iView) println("add one image:\(page)") var hud:SMS_MBProgressHUD = SMS_MBProgressHUD.showMessagManually("载入中", toView: iView) self.imageFlag.replaceObjectAtIndex(page, withObject: 1) iView.sd_setImageWithPreviousCachedImageWithURL(NSURL(string: imageNames[page]), andPlaceholderImage: nil, options: SDWebImageOptions.ProgressiveDownload, progress: { (a, b) -> Void in// println("\(page): \(b)")// hud.progress = (Float)(a)/(Float)(b) }, completed: { (tmpImage, err, cachType, url) -> Void in hud.hide(true) println("pic \(page) load complete") if let error = err { } else { self.imageFlag.replaceObjectAtIndex(page, withObject: 1) self.imageViews.replaceObjectAtIndex(page, withObject: iView) // iView.image.set // CGRectMake(frame.size.width * (CGFloat)(page), (SCREENHEIGHT - image.size.height * SCREENWIDTH / image.size.width)/2, SCREENWIDTH, image.size.height * SCREENWIDTH / image.size.width)// println(frame.width) } }) } } func scrollViewDidScroll(scrollView: UIScrollView) { if(pageControlUsed == true) { return } var pageWidth = imageBigScrollView.frame.size.width var page:Int = (Int)(floor((imageBigScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1) imagePageControl.currentPage = page self.loadImageWithPage(page - 1) self.loadImageWithPage(page) self.loadImageWithPage(page + 1) if(page != lastPageIndex) { setZoomToOne(lastPageIndex) lastPageIndex = page } } func scrollViewWillBeginDragging(scrollView: UIScrollView) { pageControlUsed = false } func scrollViewDidEndDecelerating(scrollView: UIScrollView) { pageControlUsed = false } func setZoomToOne(page:Int) { if(page < 0 || page >= imageNames.count || lastSetIndex == page) { return } println("set:\(page) \(lastPageIndex)") lastSetIndex = page needToZoomIndex = page (imageSmallScrollViews.objectAtIndex(page) as UIScrollView).setZoomScale(1, animated: true) needToZoomIndex = imagePageControl.currentPage } func tapPressed(sender:UITapGestureRecognizer) { self.dismissViewControllerAnimated(true, completion: nil) } func longPressed(sender:UILongPressGestureRecognizer) { println("\(imagePageControl.currentPage)") if(imagePageControl.currentPage != lastLongPressIndex) { lastLongPressIndex = imagePageControl.currentPage UIActionSheet(title: "选择" , delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil, otherButtonTitles: "保存图片","取消").showInView(self.view) } else { lastLongPressIndex = -1 } } func pinchPressed(sender:UIPinchGestureRecognizer) { println("pinch") var iView:UIImageView = imageViews.objectAtIndex(imagePageControl.currentPage) as UIImageView if(sender.state == UIGestureRecognizerState.Began) { beganScale = (imageSmallScrollViews.objectAtIndex(imagePageControl.currentPage) as UIScrollView).zoomScale } (imageSmallScrollViews.objectAtIndex(imagePageControl.currentPage) as UIScrollView).setZoomScale(beganScale * sender.scale, animated: true) if(sender.state == UIGestureRecognizerState.Ended) { scrollViewEnd() } } func scrollViewEnd() {// println("end") var isv = imageSmallScrollViews.objectAtIndex(imagePageControl.currentPage) as UIScrollView if(isv.zoomScale < 1.0) { println("set back 1") isv.setZoomScale(1, animated: true) } else if(isv.zoomScale > 2.0) { isv.setZoomScale(2.0, animated: true) } } func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {// println("view for zoom") return imageViews.objectAtIndex(needToZoomIndex) as UIImageView } func scrollViewDidZoom(scrollView: UIScrollView) { var iView:UIImageView = imageViews.objectAtIndex(imagePageControl.currentPage) as UIImageView var isv = imageSmallScrollViews.objectAtIndex(imagePageControl.currentPage) as UIScrollView if(isv.zoomScale < 1.0) { isv.contentOffset = CGPointMake(-(isv.frame.width - iView.frame.size.width) / 2, -(isv.frame.height - iView.frame.size.height) / 2) } } func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView!, atScale scale: CGFloat) { scrollViewEnd() } func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int) { println("actionsheet:\(buttonIndex)") if(buttonIndex == 0) { UIImageWriteToSavedPhotosAlbum((imageViews.objectAtIndex(imagePageControl.currentPage) as UIImageView).image, self, "imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:", nil) } } func imageSavedToPhotosAlbum(image:UIImage, didFinishSavingWithError error:NSError?, contextInfo:AnyObject) { if let err = error { SMS_MBProgressHUD.showError("保存失败", toView: self.view) } else { SMS_MBProgressHUD.showCompleteMessage("保存成功", toView: self.view) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. }
0 0
- iOS中UIScrollView嵌套UIImageView实现图片滑动浏览、缩放
- 关于UIScrollView中UIImageView的图片缩放问题
- iOS 使用UIScrollView实现图片的缩放
- UIScrollView实现图片浏览
- UIScrollView 实现图片缩放
- iOS UIImageView利用UIScrollView实现图片循环滚动
- Android点击WebView中的图片实现缩放及滑动浏览
- iOS UIScrollView+UIImageView 制作简单的图片浏览器,支持缩放、平移
- iOS UIScrollView+UIImageView 制作简单的图片浏览器,支持缩放、平移
- UIScrollView实现滑动图片
- IOS 结合UIImageView实现图片的移动和缩放
- iOS 之UIImageView实现图片的移动和缩放
- iOS中UIScrollView实现图片循环播放
- 【Android】一个浏览图片的Android库的实现,可以移动、缩放图片以及滑动切换
- UIImageView实现图片的移动和缩放
- iOS 利用UIScrollView 对图片进行缩放
- viewpager嵌套开源组件gesture-imageview实现图片浏览和缩放
- viewpager嵌套开源组件gesture-imageview实现图片浏览和缩放
- jdp实现分页
- Linux安装配置php
- pokers -end
- Android程序:进度条(ProgressBar)的使用方法和案例
- XSS的常见变换--XSS攻击发展
- iOS中UIScrollView嵌套UIImageView实现图片滑动浏览、缩放
- 开心的小明
- 技术中的喜闻乐见,不用session存放验证码
- 百度地图使用小技巧
- MySQL 优化(必看 必看)
- vsftpd 530 login incorrect on ubuntu
- [搜狗测试]自动化测试后台揭秘
- Java复习笔记9【数组】
- VS2013 IIS Express 添加MIME映射