私のUIScrollViewサンプルに関するヘルプが必要です。コンテンツはUIScrollViewでズームアウト時にジャンプする
コンテンツをスクロールしてズームする簡単なプログラムを作成しました(UIImageView
)。ズームアウトしようとするとコンテンツが頻繁に右下に消えてしまうことを除いて、正常に動作します。しかし、私はminimumZoomScale
を1.0fに設定しているので、実際にはズームアウトされていません。コンテンツだけがビューから飛び出しています。そしてさらに奇妙なことは、私がこれ以降スクロールできないということです。どうやらコンテンツのサイズも混乱しているようです。
私は私のサンプルコードで持っている設定は下図の通りです。
私はズームアウト(しよう)した後の状態をチェックすると、私は2つの間違ったことを発見しました。
_scrollView.contentSize
1000×1000_scrollView.bounds
2つの項目に対応するため (すなわち、
_scrollView.bounds.origin.y
は常に0である)何とかトップに
を跳んだより小さくすべきではない480×360であり、私はUIScrollViewDelegateで次のコードを追加しましたが、今は正常に動作します。
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
if(scrollView == _scrollView && view == _contentView)
{
// Setting ivars for scrollViewDidZoom
_contentOffsetBeforeZoom = _scrollView.contentOffset;
_scrollViewBoundsBeforeZoom = _scrollView.bounds;
}
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
if(scrollView == _scrollView)
{
// If you zoom out, there are cases where ScrollView content size becomes smaller than original,
// even though minimum zoom scale = 1. In that case, it will mess with the contentOffset as well.
if(_scrollView.contentSize.width < CONTENT_WIDTH || _scrollView.contentSize.height < CONTENT_HEIGHT)
{
_scrollView.contentSize = CGSizeMake(CONTENT_WIDTH, CONTENT_HEIGHT);
_scrollView.contentOffset = _contentOffsetBeforeZoom;
}
// If you zoom out, there are cases where ScrollView bounds goes outsize of contentSize rectangle.
if(_scrollView.bounds.origin.x + _scrollView.bounds.size.width > _scrollView.contentSize.width ||
_scrollView.bounds.origin.y + _scrollView.bounds.size.height > _scrollView.contentSize.height)
{
_scrollView.bounds = _scrollViewBoundsBeforeZoom;
}
}
}
ただし、これにする必要はありますか?これは非常にシンプルなシーケンスであり、Appleがこのような努力を払う必要があると考えるのは難しいです。だから、私の賭けはここに何かを見逃している...
以下は私のオリジナルコードです。私が間違っていること(または何かがないこと)を見つけるのを助けてください!
#define CONTENT_WIDTH 1000
#define CONTENT_HEIGHT 1000
>>>> Snip >>>>
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
_scrollView.contentSize = CGSizeMake(CONTENT_WIDTH, CONTENT_HEIGHT);
_scrollView.backgroundColor = [UIColor blueColor];
_scrollView.maximumZoomScale = 8.0f;
_scrollView.minimumZoomScale = 1.0f;
_scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
_scrollView.scrollEnabled = YES;
_scrollView.delegate = self;
[self.view addSubview:_scrollView];
_contentView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sample.jpg"]]; // sample.jpg is 480x360
CGPoint center = (CGPoint){_scrollView.contentSize.width/2, _scrollView.contentSize.height/2};
_contentView.center = center;
[_scrollView addSubview:_contentView];
_scrollView.contentOffset = (CGPoint) {center.x - _scrollView.bounds.size.width/2, center.y - _scrollView.bounds.size.height/2};
}
- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView
{
if(scrollView == _scrollView)
{
return _contentView;
}
return nil;
}
'_contentViewの設定を試したことがありますか?自動サイズ変更マスク= UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; '? – Adam
ありがとうございます。しかし、それは状況を変えない... – barley
あなたの 'contentSize'がなぜ1000x1000であるのか聞いてもよろしいですか? – tia