如何防止resize,以适应ScrollView高度UIView(禁用自动调整)?

我正在用vfr-reader库编写PDF阅读器。 要在横向显示两个页面,我将每个页面渲染到它自己的视图中,然后将这两个视图添加到容器视图,然后将容器视图添加到滚动视图。 每个视图的autoresizingMask设置为UIViewAutoresizingNone,contentMode为UIViewContentModeRedraw,autoresizingSubviews设置为“NO”。

但仍然不知何故容器视图自动调整,以适应滚动视图的高度,我不知道这是怎么回事。 我关心这个,因为在自动化容器视图时,它的宽度变得比屏幕宽度大,而且我不能通过一次滑动(需要两次滑动)滚动到接下来的两页。 我错过了什么?

编辑会添加一些如果有帮助。 在ViewController中,我使用以下选项创build一个滚动视图:

theScrollView = [[ReaderScrollView alloc] initWithFrame:viewRect]; theScrollView.scrollsToTop = NO; theScrollView.pagingEnabled = YES; theScrollView.delaysContentTouches = NO; theScrollView.showsVerticalScrollIndicator = NO; theScrollView.showsHorizontalScrollIndicator = NO; theScrollView.contentMode = UIViewContentModeRedraw; theScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; theScrollView.backgroundColor = [UIColor clearColor]; theScrollView.userInteractionEnabled = YES; theScrollView.autoresizesSubviews = NO; theScrollView.delegate = self; [self.view addSubview:theScrollView]; 

当我绘制页面时,我将一个UIView添加到滚动视图,这是以这种方式启动的:

 if ((self = [super initWithFrame:frame])) { self.autoresizesSubviews = YES; self.userInteractionEnabled = YES; self.contentMode = UIViewContentModeRedraw; self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.backgroundColor = [UIColor clearColor]; theScrollView = [[ReaderScrollView alloc] initWithFrame:self.bounds]; // Not sure about this part - why is the 2nd scroll view added? // this is the way its done in vfr reader theScrollView.scrollsToTop = NO; theScrollView.delaysContentTouches = NO; theScrollView.showsVerticalScrollIndicator = NO; theScrollView.showsHorizontalScrollIndicator = NO; theScrollView.contentMode = UIViewContentModeRedraw; theScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; theScrollView.backgroundColor = [UIColor clearColor]; theScrollView.userInteractionEnabled = YES; theScrollView.autoresizesSubviews = NO; theScrollView.bouncesZoom = YES; theScrollView.delegate = self; theContentView = [[ReaderContentPage alloc] initWithURL:fileURL page:page password:phrase landscape:(BOOL)isLandscape position:FALSE]; CGRect viewRect = CGRectZero; viewRect.size.width = theContentView.bounds.size.width; viewRect.size.height = theContentView.bounds.size.height; if( isLandscape){ NSLog(@"Landscape detected in content view"); if (theContentView == NULL) { theContentView = [[ReaderContentPage alloc] initWithURL:fileURL page:(page+1) password:phrase landscape:(BOOL)isLandscape position:FALSE]; theContentView2 = NULL; viewRect.size.width = theContentView.bounds.size.width; viewRect.size.height = theContentView.bounds.size.height; } else { if (page == 1) theContentView2 = NULL; else theContentView2 = [[ReaderContentPage alloc] initWithURL:fileURL page:(page+1) password:phrase landscape:(BOOL)isLandscape position:TRUE]; if (theContentView2 != NULL) viewRect.size.width = theContentView.bounds.size.width*2; } } if (theContentView != nil) // Must have a valid and initialized content view { theContainerView = [[UIView alloc] initWithFrame:viewRect]; theContainerView.autoresizesSubviews = NO; theContainerView.userInteractionEnabled = NO; theContainerView.contentMode = UIViewContentModeRedraw; theContainerView.autoresizingMask = UIViewAutoresizingNone; theContainerView.backgroundColor = [UIColor whiteColor]; theScrollView.contentSize = theContentView.bounds.size; // Content size same as view size theScrollView.contentOffset = CGPointMake((0.0f - CONTENT_INSET), (0.0f - CONTENT_INSET)); theScrollView.contentInset = UIEdgeInsetsMake(CONTENT_INSET, CONTENT_INSET, CONTENT_INSET, CONTENT_INSET); theThumbView = [[ReaderContentThumb alloc] initWithFrame:theContentView.bounds]; // Page thumb view [theContainerView addSubview:theThumbView]; // Add the thumb view to the container view [theContainerView addSubview:theContentView]; // Add the content view to the container view if(( isLandscape) && (theContentView2 != NULL)){ [theContainerView addSubview:theContentView2]; // Add the content view to the container view } [theScrollView addSubview:theContainerView]; // Add the container view to the scroll view [self updateMinimumMaximumZoom]; // Update the minimum and maximum zoom scales theScrollView.zoomScale = theScrollView.minimumZoomScale; // Zoom to fit } [self addSubview:theScrollView]; // Add the scroll view to the parent container view [theScrollView addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:NULL]; self.tag = page; // Tag the view with the page number } return self; 

ReaderContentPage是这样创build的:

 if ((self = [super initWithFrame:frame])) { self.autoresizesSubviews = NO; self.userInteractionEnabled = NO; self.clearsContextBeforeDrawing = NO; self.contentMode = UIViewContentModeRedraw; self.autoresizingMask = UIViewAutoresizingNone; self.backgroundColor = [UIColor clearColor]; view = self; // Return self } 

ReaderContentViewReaderContentView的函数updateMinimumMaximumZoom中:

适合屏幕的缩放比例的计算是通过单个视图来完成的,但是在横向上,它应该通过容器视图进行计算。

尝试replace此代码

CGFloat zoomScale = ZoomScaleThatFits(targetRect.size, theContentView.bounds.size);

CGFloat zoomScale = ZoomScaleThatFits(targetRect.size, theContainerView.bounds.size);

在UIScrollView中有一个contentMode属性,将其更改为UIViewContentModeCenter或其他内容以防止resize。