放大和平移时看到大面积的 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 背景的主要内容,如果未能解决你的问题,请参考以下文章

如何区分 UIScrollView 中的平移和滚动

如何延迟/减慢 UIScrollView 平移速度

UIScrollview 中心在放大时翻译。这是一个错误吗?

平移和缩放的替代方案

UIScrollView保存/恢复设置

在 UIScrollView 上放大时 UIButton 边框消失