我的ScrollView出现问题。我以编程方式将子视图UIImageView添加到ScrollView,并实现缩放。我使用下面的代码在iPhone上没有任何问题使图像居中,但在iPad上,图像向右移动并向下移动。我添加了iPad的故事板和一个空视图控制器并将其连接起来,就像我为iPhone做的那样。我没有ScrollView子类(这么简单,我认为不需要)。
如何让图像/滚动视图在iPad上居中?
代码:我没有在代码中的任何其他位置指定位置或大小
这都在我的viewcontroller.m
中//Create scrollView.
_scrollView = [[UIScrollView alloc] initWithFrame:[[self view] bounds]];
[_scrollView setBackgroundColor:[UIColor whiteColor]];
[_scrollView setDelegate:self];
[_scrollView setBouncesZoom:YES];
[[self view] addSubview:_scrollView];
//Add violinImage to scrollView
_currentImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:_currentImageName]];
[_scrollView setContentSize:[_currentImage frame].size];
[_scrollView addSubview:_currentImage];
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return _myImage;
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
UIView *subView = [scrollView.subviews objectAtIndex:0];
CGFloat offsetX;
CGFloat offsetY;
if (IS_IPAD)
{
offsetX = (scrollView.bounds.size.width - scrollView.contentSize.width) /2;
offsetY = scrollView.bounds.size.height * 0.3;
}
else
{
if (scrollView.bounds.size.width > scrollView.contentSize.width) {
offsetX = (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5;
}
else
{
offsetX = 0.0;
}
if (scrollView.bounds.size.height > scrollView.contentSize.height)
{
offsetY = (scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5;
}
else
{
offsetY = 0.0;
}
}
subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, scrollView.contentSize.height * 0.5 + offsetY);
}
谢谢!
答案 0 :(得分:0)
所以这对我来说是一个独特的案例,但在iPad上,我的图像并不比缩放后的滚动视图框架大。我在原始问题中没有显示的部分代码因为我认为它不相关。哎呦。
它适用于iPhone,因为我的图像总是大于框架,因此它不会应用任何偏移,并使滚动视图(和内容)居中。在iPad上我得到了iPhone数学的偏移值,所以我需要反转偏移计算。
这是我在设置缩放以使其工作时所做的。
if (IS_IPAD && IS_RETINA) {
float topInset = (imageSize.height - maxSize.height) / 2.0;
float sideInset = (imageSize.width - maxSize.width) / 2.0;
if (topInset < 0.0) topInset = 0.0;
if (sideInset < 0.0) sideInset = 0.0;
[_scrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
}
else
{
float topInset = (maxSize.height - imageSize.height) / 2.0;
float sideInset = (maxSize.width - imageSize.width) / 2.0;
if (topInset < 0.0) topInset = 0.0;
if (sideInset < 0.0) sideInset = 0.0;
[_scrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
}