私は自分の画像を表示するためのフルスクリーン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 in呼び出し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