这应该是一件很常见的事情,但我无法让它完全正常工作。
我有矩形内容。它通常适用于320x361:纵向模式减去状态栏减去广告减去标签栏。
我已将该内容放在UIScrollView中并启用了缩放功能。我也希望界面旋转起作用。内容将始终是一个高大的矩形,但当缩放的用户可能希望一次看到更多的宽度和更少的高度。
在Interface Builder和代码中我需要做什么才能完成这项工作?我应该如何在不同的视图上设置自动调整?如何设置我的contentSize和contentInsets?
我尝试了很多不同的方法,但没有任何方法是完全正确的。在我的各种解决方案中,我在缩放,界面旋转和滚动之后遇到了一些问题,现在无法再滚动到屏幕上的整个内容。在您看到内容的边缘之前,滚动视图会让您重新振作起来。
我现在这样做的方式大约是80%。也就是说,它应该做的10件事中,其中有8件。它做错的两件事是:
在纵向模式下放大时,您可以滚动浏览内容的边缘,然后看到黑色背景。抱怨并不是太多。至少你可以看到所有的内容。在横向模式下,放大或不放大,看到黑色背景经过边缘是正常的,因为内容没有足够的宽度以1:1缩放级别(最小)填充屏幕。
当我在运行iOS 3.0的测试设备上运行时,我仍然会让内容脱离困境,但它可以运行4.x. - 实际上这与以前的解决方案有关。我的测试人员没有尝试过最新的解决方案。
这是我目前正在使用的解决方案。总而言之,我已经将滚动视图设置为需要两个方向的宽度和高度,因为我发现手动或自动调整大小会增加复杂性并且很脆弱。
查看层次结构:
视图为320x411并且已启用所有自动调整大小选项,因此符合屏幕形状
scrollView 480 x 361,从原点-80,0开始,仅锁定到顶部并禁用拉伸
scrollableArea 480 x 361并锁定到左侧和顶部。由于scrollView禁用拉伸,因此其子视图的自动调整遮罩无关紧要,但无论如何我都会告诉你。
内容为320x361,从原点80,0开始,锁定到顶部
我将scrollView.contentSize
设置为480x361。
shouldAutorotateToInterfaceOrientation
支持除肖像上下颠倒之外的所有方向。
在didRotateFromInterfaceOrientation中,如果方向为横向,则设置底部内容插入为160,否则重置为0。如果方向为纵向,我将左右指示插图设置为80,如果不是则重置。
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 2.0
viewForZoomingInScrollView返回scrollableArea
答案 0 :(得分:4)
// in IB it would be all options activated
scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
scrollView.contentSize = content.frame.size; // or bounds, try both
你对scrollableArea
的意思是什么?
您的minZoomScale
设置为1.0
,对于纵向模式,但不适用于横向模式。因为在横向中您的身高比在纵向中要小,所以您需要使用小于1.0
的值。对我来说,我使用这个实现并每次调用它,scrollView的框架确实改变了:
- (void)setMaxMinZoomScalesForCurrentBounds {
CGSize boundsSize = self.bounds.size; // self is a UIScrollView here
CGSize contentSize = content.bounds.size;
CGFloat xScale = boundsSize.width / contentSize.width;
CGFloat yScale = boundsSize.height / contentSize.height;
CGFloat minScale = MIN(xScale, yScale);
if (self.zoomScale < minScale) {
[self setZoomScale:minScale animated:NO];
}
if (minScale<self.maximumZoomScale) self.minimumZoomScale = minScale;
//[self setZoomScale:minScale animated:YES];
}
- (void)setFrame:(CGRect)rect { // again, this class is a UIScrollView
[super setFrame:rect];
[self setMaxMinZoomScalesForCurrentBounds];
}
答案 1 :(得分:0)
我不认为我从你的帖子中理解了整个问题,但这里是我理解的答案。
据我所知(并使用UIScrollView),UIScrollView中的内容不会与UIScrollView一起自动自动恢复。
将UIScrollView视为您内容所在的另一个Universe的窗口/门户。自动调整UIScrollView时,您只需更改查看窗口的形状/大小...而不是其他Universe中内容的大小。
但是,如果需要,您可以拦截旋转事件并手动更改您的内容(使用动画使其看起来很好)。
对于正确的自动调整大小,您应该更改scrollView的contentSize(以便它知道您的Universe的大小),还可以更改UIView的大小。我认为这就是为什么你能够滚动并获得黑色内容的原因。也许您刚刚更新了contentSize,但现在更新了实际内容视图。
就个人而言,我没有遇到任何需要随UIScrollView调整内容大小的情况,但我希望这会让你开始朝着正确的方向前进。
答案 2 :(得分:0)
如果我理解正确,你想要一个带有图像的滚动视图。它需要全屏开始,你需要能够放大。最重要的是你希望它能够根据方向旋转。
我过去一直在使用它进行原型设计,如果以上所有内容都正确,则以下代码应该适合您。
我为吧/自定义栏留下了一点白色区域。
- (void)viewDidLoad
{
[super viewDidLoad];
//first inits and allocs
scrollView2 = [[UIScrollView alloc] initWithFrame:self.view.frame];
imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImageName"]];
[scrollView2 addSubview:imageView];
[self drawContent]; //refreshing the content
[self.view addSubview:scrollView2];
}
-(void)drawContent
{
//this refreshes the screen to the right sizes and zoomscales.
[scrollView2 setBackgroundColor:[UIColor blackColor]];
[scrollView2 setCanCancelContentTouches:NO];
scrollView2.clipsToBounds = YES;
[scrollView2 setDelegate:self];
scrollView2.indicatorStyle = UIScrollViewIndicatorStyleWhite;
[scrollView2 setContentSize:CGSizeMake(imageView.frame.size.width, imageView.frame.size.height)];
[scrollView2 setScrollEnabled:YES];
float minZoomScale;
float zoomHeight = imageView.frame.size.height / scrollView2.frame.size.height;
float zoomWidth = imageView.frame.size.width / scrollView2.frame.size.width;
if(zoomWidth > zoomHeight)
{
minZoomScale = 1.0 / zoomWidth;
}
else
{
minZoomScale = 1.0 / zoomHeight;
}
[scrollView2 setMinimumZoomScale:minZoomScale];
[scrollView2 setMaximumZoomScale:7.5];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
// Portrait
//the 88pxls is the white area that is left for the navbar etc.
self.scrollView2.frame = CGRectMake(0, 88, [UIScreen mainScreen].bounds.size.width, self.view.frame.size.height - 88);
[self drawContent];
}
else {
// Landscape
//the 88pxls is the white area that is left for the navbar etc.
self.scrollView2.frame = CGRectMake(0, 88, [UIScreen mainScreen].bounds.size.height, self.view.frame.size.width);
[self drawContent];
}
return YES;
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.imageView;
}
我希望这能解决你的麻烦。如果没有发表评论。
答案 3 :(得分:0)
如果您要在UIView
中放置内容(theViewInstance
实例,我们称之为UIScrollView
),然后滚动/缩放theViewInstance
,前往做到了:
theViewInstance
应添加为UIScrollView
将委托设置为UIScrollView
实例并实现选择器以返回应该用于缩放/滚动的视图:
-(UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return theViewInstance;
}
默认情况下,将UIScrollView的contentSize设置为theViewInstance的框架:
scrollView.contentSize=theViewInstance.frame.size;
(此外,可以在UIScrollView中设置可接受的缩放级别:)
scrollView.minimumZoomScale=1.0;
scrollView.maximumZoomScale=3.0;
这是在UIImage上实现缩放的方式:将UIImageView添加到UIScrollView,在UIScrollViewDelegate实现中,返回UIImageView(例如,如here所述)。
对于旋转支持,这是在UIViewController中完成的,其UIView包含我们刚才谈到的UIScrollView。