2012-05-11 14 views
1

アップルのサンプルコードからPhotoScroller.appのコードを使用して、画像を表示するためのフルスクリーンのUIScrollViewがあります。私は、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は、スクロールビューの世話をするビューコントローラに呼ばれています。 self.frame.origin等号として

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. 

} 

(0、0)と= self.bounds.sizeself.frame.size、私はboundsCenter/2 self.bounds.sizeされるべきだと思います。そうではありません。どうして?本当に混乱している!

は、肖像画から風景に画面を回転:

の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 
+2

あなたが見ているNSLog出力を投稿できますか? – Dima

+0

フレームには4つの値(x、y、幅、高さ)があります。私はあなたが意味すると仮定しています。self.frame.origin =(0,0) –

+0

@lolcat 2 –

答えて

1

あなたはNSLog self.bounds.originできますか?私は、使用している中間点関数が、原点に関連して矩形の中心を与えることが問題だと思います。原点が(0,0)でない場合、boundsCenterはbounds.size/2になりません。

+0

はい、私は質問を更新します。 (0,0)? –

+0

一般的にはそうではない場合がありますが、もしあなたがNSLogであれば、私はそうでなければならないと考えていることが分かります。 – Dima

+0

まだあなたの質問にbounds.originの出力が表示されないので、おそらくあなたが誤解しています。 – Dima