边界的中心

我有一个全屏的UIScrollView来显示我的图像,它采用从苹果示例代码从PhotoScroller.app一些代码。 我对获得imageScrollView边界的中心点有点困惑。

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在负责滚动视图的视图控制器中被调用。

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. } 

由于self.frame.origin等于(0,0)和self.frame.size = self.bounds.size ,我认为boundsCenter应该是self.bounds.size / 2。 但事实并非如此。 为什么? 真的很困惑!

将画面从纵向旋转到横向:

NSLog调用willRotateToInterfaceOrientation:持续时间:

 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调用willAnimateRotationToInterfaceOrientation:持续时间:

 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 

你可以NSLog self.bounds.origin? 我认为这个问题是你正在使用的中点函数给你的矩形的中心相对于原点。 如果原点不是(0,0),那么boundsCenter不会仅仅是bounds.size / 2

Interesting Posts