放大和平移时看到大面积的 UIScrollView 背景
Posted
技术标签:
【中文标题】放大和平移时看到大面积的 UIScrollView 背景【英文标题】:Seeing large area of UIScrollView background when zoomed-in & pan down 【发布时间】:2011-03-04 21:59:32 【问题描述】:问题:
我遇到的问题是,当我放大 UIScrollView(启用分页),然后向下平移(滚动?)时,我可以很好地拖过我的视图并看到滚动视图背景的大片区域。我放大得越多,UIScrollView 的背景就越多。 (我已将滚动视图的背景设置为绿色,这样我就可以知道我在看什么)。
不知道为什么背景区域会这样暴露...?
我尝试在不同位置设置滚动视图的框架大小、边界大小、内容大小等,但无济于事。
不幸的是,由于是新用户,我无法发布发生的事情的屏幕截图:(
更多详情:
我的应用程序的主视图包含一个全屏大小的 UIScrollView,其中填充了许多 UIView 子视图。这些子视图通过在 for 循环中创建 nib 名称添加到滚动视图,然后使用 loadNibNamed 方法检索它们以创建和添加 UIView。
这些 UIView 中的每一个都是在 IB 中设计的,包含以下内容:一个 UIImageView,其图像属性设置为 .jpg 图像,另一个较小的 UIScrollView 在其下方,以及在我的 imageview 顶部的透明 UIView,其中包含一堆自定义UIButtons。
填充我的滚动视图后,我设置了它的一些属性,例如 contentSize、pagingEnabled、min 和 maxZoomScale 等,然后将它的委托设置为 self (MainViewController)。
MainViewController的相关方法:
@implementation MainViewController_iPhone
@synthesize scrollView, loadedNibView;
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
[super viewDidLoad];
[self loadNibs];
[self initializeOrientation];
-(void) loadNibs
currentPage = 0;
for (int i = 0; i < NUM_VIEWS; i++)
loadedNibView = [self getNibView:i]; //load the UIView from the associated nib file
loadedNibView.tag = i; //used later to retrieve view for current page
[scrollView addSubview:loadedNibView];
//Set the content size to sum of the widths of the all UIViews
scrollView.contentSize = CGSizeMake(self.view.frame.size.width * NUM_VIEWS, self.view.frame.size.height);
scrollView.pagingEnabled = YES;
scrollView.bounces = YES;
scrollView.clipsToBounds = YES;
//scrollView.alwaysBounceVertical = YES;
//zoom features
scrollView.maximumZoomScale = 5.0;
scrollView.minimumZoomScale = 1;
scrollView.delegate = self;
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)myScrollView
return [myScrollView viewWithTag:(currentPage)];
- (void)scrollViewDidScroll:(UIScrollView *)myScrollView
CGFloat pageWidth = myScrollView.frame.size.width;
currentPage = floor((myScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
- (void)scrollViewDidZoom:(UIScrollView *)myScrollView
- (void)scrollViewWillBeginZooming:(UIScrollView *)myScrollView withView:(UIView *)view
//zooming & paging do not work well together; disable paging while we're zooming
myScrollView.pagingEnabled = NO;
- (void)scrollViewDidEndZooming:(UIScrollView *)myScrollView withView:(UIView *)view atScale:(float)scale
if(scale == 1) //if we're zoomed entirely back out
//re-enable paging & reset the content size
myScrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(self.view.frame.size.width * NUM_VIEWS, self.view.frame.size.height); //without this line, can no longer page through scrollview after zooming
@end
它是 .h:
@interface MainViewController_iPhone : MainViewController <UIScrollViewDelegate>
IBOutlet UIScrollView *scrollView; //The main ScrollView that scrolls between pages of different images to search
UIView *loadedNibView; //The UIView that we load from it's corresponding nib (i.e. IMG1_iPhone.xib)
int currentPage;
//methods
-(void) loadNibs;
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)myScrollView;
- (void)scrollViewWillBeginZooming:(UIScrollView *)myScrollView withView:(UIView *)view;
- (void)scrollViewDidEndZooming:(UIScrollView *)myScrollView withView:(UIView *)view atScale:(float)scale;
- (void)scrollViewDidZoom:(UIScrollView *)myScrollView;
- (void)scrollViewDidScroll:(UIScrollView *)myScrollView;
//properties
@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) UIView *loadedNibView;
@end
任何想法/建议将不胜感激...谢谢!
【问题讨论】:
【参考方案1】:好的,我知道我的问题是什么了。
我意识到,当我放大第一张图像时,它给了我奇怪的行为,滚动视图背景随着我的缩放而增长,但如果我放大第二张图像 - 没有奇怪的行为。所以我开始想知道这两个图像之间有什么区别......并意识到它一定是标签。在我加载视图并设置它们的标签的 for 循环中,我将第一个设置为零,并从那里递增。糟糕——有点忘了还有很多其他视图和对象的默认标签为零!所以后来当它请求带有标签 0 的视图时 - 它正在返回一些其他视图,这是调整大小而不是我的图像的视图。
修复:
#define ZOOM_TAG 1000
...
for (int i = 0; i < NUM_VIEWS; i++)
loadedNibView = [self getNibView:i];
//loadedNibView.tag = i
loadedNibView.tag = i + ZOOM_TAG; //used later to retrieve view for current page
[scrollView addSubview:loadedNibView];
...
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)myScrollView
//return [myScrollView viewWithTag:(currentPage)];
return [myScrollView viewWithTag:(currentPage + ZOOM_TAG)];
【讨论】:
以上是关于放大和平移时看到大面积的 UIScrollView 背景的主要内容,如果未能解决你的问题,请参考以下文章