Center of bounds

独自空忆成欢 提交于 2020-01-05 19:26:22

问题


I have a full screen UIScrollView to display my image, which employ some codes from PhotoScroller.app from apple sample code. I am little confused on the obtaining of the center point of the imageScrollView's bounds.

ImageScrollView.m

- (CGPoint)pointToCenterAfterRotation
{

NSLog(@"imageScrollView frame X and Y are %f and %f ",self.frame.origin.x, self.frame.origin.y);
NSLog(@"imageScrollView frame Width and Height are %f and %f ",self.frame.size.width, self.frame.size.height);
NSLog(@"imageScrollView bounds origin X and Y are %f and %f ",self.bounds.origin.x, self.bounds.origin.y);
NSLog(@"imageScrollView bounds Width and Height are %f and %f ",self.bounds.size.width, self.bounds.size.height);

NSLog(@"imageView frame origin X and Y are %f and %f", imageView.frame.origin.x, imageView.frame.origin.y);
NSLog(@"imageView frame size Width and Height are %f and %f", imageView.frame.size.width,imageView.frame.size.height);
NSLog(@"imageView bounds origin X and Y are %f and %f", imageView.bounds.origin.x,imageView.bounds.origin.y);
NSLog(@"imageView bounds size Width and Height are %f and %f", imageView.bounds.size.width,imageView.bounds.size.height);

CGPoint boundsCenter = CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
CGPoint convertPoint = [self convertPoint:boundsCenter toView:imageView];

NSLog(@"boundsCenter X and Y are %f and %f ",boundsCenter.x, boundsCenter.y);
NSLog(@"convertPoint origin X and Y are %f and %f", convertPoint.x, convertPoint.y);

return [self convertPoint:boundsCenter toView:imageView];
}

- (void)setMaxMinZoomScalesForCurrentBounds
{
CGSize boundsSize = self.bounds.size;
CGSize imageSize = imageView.bounds.size;

// calculate min/max zoomscale
CGFloat xScale = boundsSize.width / imageSize.width;    // the scale needed to perfectly fit the image width-wise
CGFloat yScale = boundsSize.height / imageSize.height;  // the scale needed to perfectly fit the image height-wise
CGFloat minScale = MIN(xScale, yScale);                 // use minimum of these to allow the image to become fully visible
CGFloat maxScale = 1.0;
// don't let minScale exceed maxScale. (If the image is smaller than the screen, we don't want to force it to be zoomed.) 
if (minScale > maxScale) {
    minScale = maxScale;
}

self.maximumZoomScale = maxScale;
self.minimumZoomScale = minScale;
}
- (void)restoreCenterPoint:(CGPoint)oldCenter scale:(CGFloat)oldScale
{    
// Step 1: restore zoom scale, first making sure it is within the allowable range.
self.zoomScale = MIN(self.maximumZoomScale, MAX(self.minimumZoomScale, oldScale));

// Step 2: restore center point, first making sure it is within the allowable range.

// 2a: convert our desired center point back to our own coordinate space
CGPoint boundsCenter = [self convertPoint:oldCenter fromView:imageView];
// 2b: calculate the content offset that would yield that center point
CGPoint offset = CGPointMake(boundsCenter.x - self.bounds.size.width / 2.0, 
                             boundsCenter.y - self.bounds.size.height / 2.0);
// 2c: restore offset, adjusted to be within the allowable range
CGPoint maxOffset = [self maximumContentOffset];
CGPoint minOffset = [self minimumContentOffset];
offset.x = MAX(minOffset.x, MIN(maxOffset.x, offset.x));
offset.y = MAX(minOffset.y, MIN(maxOffset.y, offset.y));

NSLog(@"offset x is %f",offset.x);
NSLog(@"offset y is %f",offset.y);

self.contentOffset = offset;
}

pointToCenterAfterRotation is called in the view controller who takes care of the scroll view.

ScrollViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];
self.wantsFullScreenLayout = YES;
[[UIApplication sharedApplication] setStatusBarHidden:YES];
actionSheetCoverView = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,480)];
self.view = actionSheetCoverView;
self.imageScrollView = [[[ImageScrollView alloc] init] autorelease];
imageScrollView.frame = [self frameForScrollView];
[actionSheetCoverView addSubview:imageScrollView];
imageScrollView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
}

- (CGRect)frameForScrollView {
CGRect bounds = actionSheetCoverView.bounds;
CGRect frame = bounds;
return frame;
}

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{   
CGPoint restorePoint = [imageScrollView pointToCenterAfterRotation];
CGFloat restoreScale = [imageScrollView scaleToRestoreAfterRotation];
[imageScrollView setMaxMinZoomScalesForCurrentBounds];
[imageScrollView restoreCenterPoint:restorePoint scale:restoreScale]; 

}
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
CGPoint restorePoint = [imageScrollView pointToCenterAfterRotation];
//call here just for nslog the frame and bounds before rotation.

}

As the self.frame.origin equals (0, 0) and self.frame.size = self.bounds.size, I think the boundsCenter should be self.bounds.size/2. But it is not. Why? really confused!

Rotate the screen from portrait to landscape:

NSLog in call willRotateToInterfaceOrientation:duration:

2012-05-12 11:35:45.666 imageScrollView frame X and Y are 0.000000 and 0.000000 
2012-05-12 11:35:45.672 imageScrollView frame Width and Height are 320.000000 and 480.000000 
2012-05-12 11:35:45.677 imageScrollView bounds origin X and Y are 0.000000 and 0.000000 
2012-05-12 11:35:45.682 imageScrollView bounds Width and Height are 320.000000 and 480.000000 
2012-05-12 11:35:45.686 imageView frame origin X and Y are 0.000005 and 0.374437
2012-05-12 11:35:45.689 imageView frame size Width and Height are 320.000000 and 479.251129
2012-05-12 11:35:45.693 imageView bounds origin X and Y are 0.000000 and 0.000000
2012-05-12 11:35:45.697 imageView bounds size Width and Height are 641.000000 and 959.999939
2012-05-12 11:35:45.701 boundsCenter X and Y are 160.000000 and 240.000000 
2012-05-12 11:35:45.705 convertPoint origin X and Y are 320.500000 and 479.999969

NSLog in call willAnimateRotationToInterfaceOrientation:duration:

2012-05-12 11:36:05.975 imageScrollView frame X and Y are 0.000000 and 0.000000 
2012-05-12 11:36:05.978 imageScrollView frame Width and Height are 480.000000 and 320.000000 
2012-05-12 11:36:05.983 imageScrollView bounds origin X and Y are 0.000000 and 0.000000 
2012-05-12 11:36:05.987 imageScrollView bounds Width and Height are 480.000000 and 320.000000 
2012-05-12 11:36:05.990 imageView frame origin X and Y are 80.000008 and 0.000017
2012-05-12 11:36:05.994 imageView frame size Width and Height are 320.000000 and 479.251099
2012-05-12 11:36:06.002 imageView bounds origin X and Y are 0.000000 and 0.000000
2012-05-12 11:36:06.006 imageView bounds size Width and Height are 641.000000 and 959.999878
2012-05-12 11:36:06.009 boundsCenter X and Y are 240.000000 and 160.000000 
2012-05-12 11:36:06.014 convertPoint origin X and Y are 320.500000 and 320.499969

回答1:


can you NSLog self.bounds.origin? I think the issue is that the midpoint functions you are using give you the center of the rectangle in relation to the origin. If the origin is not (0,0), the boundsCenter will not just be bounds.size/2



来源:https://stackoverflow.com/questions/10556265/center-of-bounds

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!