ios - UIScrollView at 3x zoom with UIView overlay -


i have uiscrollview containing large image of size 3354 x 2082. have uiscrollview zoomed out display entire image. adding red circles this:

cgrect positionframe = cgrectmake(500,500,5,5); redcircle * circleview = [[redcircle alloc] initwithframe:positionframe]; [self.scrollview addsubview:circleview]; 

problem - red circle not have same position in zoom out (newzoomscale = 0.305307f;) , full zoom (newzoomscale = 3.0f;).

this more of logical question syntax. genius out there can help?

edit: posting entire code:

@interface mainmap () @property (nonatomic, strong) uiimageview *imageview;  - (void)centerscrollviewcontents; - (void)scrollviewdoubletapped:(uitapgesturerecognizer*)recognizer; @end  @implementation mainmap @synthesize scrollview = _scrollview; @synthesize imageview = _imageview;   - (id)initwithnibname:(nsstring *)nibnameornil bundle:(nsbundle *)nibbundleornil{ self = [super initwithnibname:nibnameornil bundle:nibbundleornil]; if (self) {     // custom initialization } return self; }  - (void)viewdidload{ [super viewdidload];  // set image want scroll & zoom , add scroll view uiimage *image = [uiimage imagenamed:@"worldmap.jpg"]; self.imageview = [[uiimageview alloc] initwithimage:image]; self.imageview.frame = (cgrect){.origin=cgpointmake(0.0f, 0.0f), .size=image.size}; [self.scrollview addsubview:self.imageview];  // tell scroll view size of contents self.scrollview.contentsize = image.size; //self.scrollview.scrollenabled = no;  uitapgesturerecognizer *doubletaprecognizer = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(scrollviewdoubletapped:)]; doubletaprecognizer.numberoftapsrequired = 2; doubletaprecognizer.numberoftouchesrequired = 1; [self.scrollview addgesturerecognizer:doubletaprecognizer];  uitapgesturerecognizer *twofingertaprecognizer = [[uitapgesturerecognizer alloc] initwithtarget:self action:@selector(scrollviewtwofingertapped:)]; twofingertaprecognizer.numberoftapsrequired = 1; twofingertaprecognizer.numberoftouchesrequired = 2; [self.scrollview addgesturerecognizer:twofingertaprecognizer]; }  - (void)viewwillappear:(bool)animated{ [super viewwillappear:animated];  // set minimum & maximum zoom scales cgrect scrollviewframe = self.scrollview.frame; cgfloat scalewidth = scrollviewframe.size.width / self.scrollview.contentsize.width; cgfloat scaleheight = scrollviewframe.size.height / self.scrollview.contentsize.height; cgfloat minscale = min(scalewidth, scaleheight);  self.scrollview.minimumzoomscale = minscale; self.scrollview.maximumzoomscale = 3.0f; self.scrollview.zoomscale = minscale;  [self centerscrollviewcontents];   cgrect positionframe = cgrectmake(500,500,5,5); redcircle * circleview = [[redcircle alloc] initwithframe:positionframe]; [self.scrollview addsubview:circleview]; }   - (void)centerscrollviewcontents{ cgsize boundssize = self.scrollview.bounds.size; cgrect contentsframe = self.imageview.frame;  if (contentsframe.size.width < boundssize.width) {     contentsframe.origin.x = (boundssize.width - contentsframe.size.width) / 2.0f; } else {     contentsframe.origin.x = 0.0f; }  if (contentsframe.size.height < boundssize.height) {     contentsframe.origin.y = (boundssize.height - contentsframe.size.height) / 2.0f; } else {     contentsframe.origin.y = 0.0f; }  self.imageview.frame = contentsframe; }  - (void)scrollviewdoubletapped:(uitapgesturerecognizer*)recognizer{ // location within image view tapped cgpoint pointinview = [recognizer locationinview:self.imageview];  // zoom scale that's zoomed in slightly, capped @ maximum zoom scale specified scroll view cgfloat newzoomscale = 0.0f; if(self.scrollview.zoomscale == 3.0f) {     newzoomscale = 0.305307f; } else {     newzoomscale = 3.0f; }  newzoomscale = min(newzoomscale, self.scrollview.maximumzoomscale);  // figure out rect want zoom to, zoom cgsize scrollviewsize = self.scrollview.bounds.size;  cgfloat w = scrollviewsize.width / newzoomscale; cgfloat h = scrollviewsize.height / newzoomscale; cgfloat x = pointinview.x - (w / 2.0f); cgfloat y = pointinview.y - (h / 2.0f);  cgrect recttozoomto = cgrectmake(x, y, w, h);  [self.scrollview zoomtorect:recttozoomto animated:yes];   float scale = self.scrollview.zoomscale; cgrect positionframe = cgrectmake(500 * scale, 500 * scale ,50,50); redcircle * circleview = [[redcircle alloc] initwithframe:positionframe]; [self.scrollview addsubview:circleview]; }  - (uiview*)viewforzoominginscrollview:(uiscrollview *)scrollview{ // return view want zoom return self.imageview; }  - (void)scrollviewdidzoom:(uiscrollview *)scrollview{ // scroll view has zoomed, need re-center contents [self centerscrollviewcontents]; }   - (void)viewdidunload{ [super viewdidunload]; // release retained subviews of main view. }  - (void)didreceivememorywarning{ [super didreceivememorywarning]; // dispose of resources can recreated. }  @end 

use zoomscale property of uiscrollview.

float scale = self.scrollview.zoomscale; cgrect positionframe = cgrectmake(500 * scale, 500 * scale ,5,5); 

adjust position in scrollviewdidzoom: delegate method.


Comments

Popular posts from this blog

jquery - How can I dynamically add a browser tab? -

node.js - Getting the socket id,user id pair of a logged in user(s) -

keyboard - C++ GetAsyncKeyState alternative -