scrollView浏览图片并缩放
程序员文章站
2022-06-17 20:48:10
一、应用场景 类似微信发朋友圈添加图片(相册或拍照),点击图片可以浏览,浏览时可对当前图片进行缩放,并且该缩放不影响其他图片正常显示;浏览时可删除图片 二、关键代码 //这里主要的问题是:如果采用CGAffineTransformScale对scrollview进行缩放,则浏览时移到下一张图片也会跟 ......
一、应用场景
类似微信发朋友圈添加图片(相册或拍照),点击图片可以浏览,浏览时可对当前图片进行缩放,并且该缩放不影响其他图片正常显示;浏览时可删除图片
二、关键代码
//这里主要的问题是:如果采用cgaffinetransformscale对scrollview进行缩放,则浏览时移到下一张图片也会跟着缩放;如果捏合手势添加到scrollview的imageview中,同样采用cgaffinetransformscale对该图片缩放(pinges.view.transform = cgaffinetransformscale(self.scrollview.transform, newscale, newscale);)并没有效果;
//因此,采用的策略是:在scrollview中嵌套scrollview,然后再嵌套imageview,并且采用zoomtorect缩放,而非cgaffinetransformscale
- (void)culayoutsubviews { bl_loadnavheight; self.scrollview = [[uiscrollview alloc] initwithframe:cgrectmake(0, 0, screenwidth_n(), screenheight_n())]; self.scrollview.backgroundcolor = [uicolor blackcolor]; [self.view addsubview:self.scrollview]; self.scrollview.delegate = self; self.scrollview.pagingenabled = yes; self.scrollview.scrollenabled = yes; self.scrollview.showshorizontalscrollindicator = no; [self.imagearr enumerateobjectsusingblock:^(id _nonnull obj, nsuinteger idx, bool * _nonnull stop) { uiscrollview *subscrollview = [[uiscrollview alloc] initwithframe:cgrectmake(idx*screenwidth_n(), navviewh, screenwidth_n(), screenheight_n()-navviewh)]; subscrollview.backgroundcolor = [uicolor blackcolor]; subscrollview.contentsize = cgsizemake(screenwidth_n(), screenheight_n()-navviewh); subscrollview.delegate = self; subscrollview.minimumzoomscale = self.minscale; subscrollview.maximumzoomscale = self.maxscale; [subscrollview setzoomscale:1.0]; uiimage *img = (uiimage *)obj; uiimageview *imgview = [[uiimageview alloc] initwithframe:cgrectmake(0, 0, screenwidth_n(), screenheight_n()-navviewh)]; imgview.userinteractionenabled = yes; imgview.contentmode = uiviewcontentmodescaleaspectfit; imgview.image = img; uipinchgesturerecognizer *pin = [[uipinchgesturerecognizer alloc] initwithtarget:self action:@selector(pingesclick:)]; //捏合手势 [imgview addgesturerecognizer:pin]; [subscrollview addsubview:imgview]; [self.scrollview addsubview:subscrollview]; [self.subscrollviewarr addobject:subscrollview]; [self.imgviewarr addobject:imgview]; }]; [self adjustscrollviewoffset]; // uitapgesturerecognizer *tap = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(navhidden)]; // [self.scrollview addgesturerecognizer:tap]; }
- (void)pingesclick:(uipinchgesturerecognizer *)pinges { // switch (pinges.state) { // case uigesturerecognizerstatebegan://scale began // case uigesturerecognizerstatechanged://scale changed // { // cgfloat currentscale = [[self.scrollview.layer valueforkeypath:@"transform.scale"] floatvalue]; // cgfloat newscale = pinges.scale - self.lastscale + 1; // // newscale = min(newscale, self.maxscale / currentscale); // newscale = max(newscale, self.minscale / currentscale); // // self.scrollview.transform = cgaffinetransformscale(self.scrollview.transform, newscale, newscale); // // for (int i = 0; i < self.imgviewarr.count; i++) { // uiimageview *subimgview = self.imgviewarr[i]; // nslog(@"subimgview----%d---%@", i, subimgview); // } // // self.lastscale = pinges.scale; // // // } // break; // case uigesturerecognizerstateended://scale ended // self.lastscale = 1; // break; // default: // break; // } float newscale = [(uiscrollview*)pinges.view.superview zoomscale]; cgrect zoomrect = [self zoomrectforscale:newscale inview:(uiscrollview*)pinges.view.superview withcenter:[pinges locationinview:pinges.view]]; [(uiscrollview*)pinges.view.superview zoomtorect:zoomrect animated:yes]; }
//必须返回当前缩放视图——实现代理方法
//放回当前缩放图片 - (uiview *)viewforzoominginscrollview:(uiscrollview *)scrollview { for (uiview *v in scrollview.subviews){ return v; } return nil; }
三、效果