嵌套的UIScrollView使用UIImageview

时间:2012-12-26 12:27:13

标签: iphone objective-c uiscrollview

在将我的问题描述为一个非常基本的问题之前,我们是否可以通过此方法返回UIScrollView个对象

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView

现在我的问题是,我有一个父scrollview,里面有多个子scrollview(所有水平和分页启用)。

每个孩子scrollview都有一个ImageView。我从服务器获得了zoomScale因素并且基于image,我必须对其进行缩放,问题是当我尝试缩放内部有scrollView的孩子image时它,它只缩放最后一个孩子scrollview

所以我想,我需要找到一种方法,我们可以返回上述书面代表的scrollview形式。

任何人都知道如何解决这个问题?


这是UIView类,我在这上面添加了scrollView和图像,并返回了imageView for scrollView Delegate

示例代码

     - (id)initWithFrame:(CGRect)frame image:(UIImage *)image
{
    self = [super initWithFrame:frame];
    if (self) {

        self.backgroundColor=[UIColor yellowColor];      
        self.imageView = [[UIImageView alloc] initWithImage:image];
        self.imageView.tag = VIEW_FOR_ZOOM_TAG;
        self.imageView.frame=frame;//CGRectMake(8,8 ,305, 400);
        [self.imageView setContentMode:UIViewContentModeScaleAspectFit];


        self.scrollView = [[UIScrollView alloc] initWithFrame:frame];
        self.scrollView.minimumZoomScale = 0.4f;
        self.scrollView.maximumZoomScale = 2.0f;
        self.scrollView.backgroundColor=[UIColor redColor];
        self.scrollView.zoomScale = 1.0f;
        self.scrollView.contentSize = self.imageView.bounds.size;
        self.scrollView.delegate = self;
        self.scrollView.showsHorizontalScrollIndicator = NO;
        self.scrollView.showsVerticalScrollIndicator = NO;
        [self.scrollView setCanCancelContentTouches:NO];
        [self.scrollView addSubview:self.imageView];
        [self addSubview:self.scrollView];

        NSLog(@"ScrollViewPostion %f",self.scrollView.frame.origin.x);
    }
    return self;
}

#pragma -mark
#pragma -mark ScrollViewDelegates
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return [scrollView viewWithTag:VIEW_FOR_ZOOM_TAG];
}

在我的主viewController类中,我这样做但是它没有在scrollview中正确添加所有图像

 NSLog(@"Inner scrollFrame and content size %f %f",innerScrollFrame.origin.x,mainScrollView.contentSize.width);
    JoinSeeSubView *subView=[[JoinSeeSubView alloc] initWithFrame:innerScrollFrame image:img];
    [self.mainScrollView addSubview:subView];


        if (i < [self.allUrlArray count]-1) {
            innerScrollFrame.origin.x += innerScrollFrame.size.width;
    }
    i++;
    mainScrollView.contentSize = CGSizeMake(innerScrollFrame.origin.x + innerScrollFrame.size.width, mainScrollView.bounds.size.height);

2 个答案:

答案 0 :(得分:1)

我不完全确定问题是什么,但是您正在循环浏览多个图像并重新编写imageViewpageScrollView属性,因此在添加最后一个后,这就是您的位置指针将指向,这就是为什么它只缩放你的最后一张图像。

最好的方法是创建一个UIView子类来处理每个图像及其父卷轴视图,只需将该类添加到主UIScrollView

如果您不想这样做,则必须找到另一种方法来访问每个单独的UIScrollView,可能使用标签,但不建议这样做


编辑 - 某些基本代码

@interface A : UIView {
    UIScrollView *scrollView
    UIImage View *imageView;

}
// initialization method that gets the image and the CGRect
@end
@implementation A
// implement initialization that loads the UIImage into the imageView, and set scrollView.delegate = self
// implement scroll view delegate method viewForZooming and return the imageView
@end

然后,在你正在使用的任何课程上:

for (int i = 0; i < imagesCount; i++) {
    UIImage *image = ...; // image i
    CGRect rect = ...; // find rect
    A *subview = [[A alloc] initWithFrame:rect image:image]
    [self.mainScroll addSubview:subview];
}

答案 1 :(得分:0)

如果上述方法无法帮助真正有需要的人,我以不同的方式解决了这个问题,但不确定这是否是正确的方法。

因此,我没有创建一个扩展UIView的新类,而是在该数组中创建并数组并存储内部scrollview的所有对象。所以我的代码看起来像

       UIScrollView *pageScrollView = [[UIScrollView alloc] initWithFrame:innerScrollFrame];
        pageScrollView.minimumZoomScale = 0.4f;
        pageScrollView.maximumZoomScale = 2.0f;
        pageScrollView.zoomScale = 1.0f;
        pageScrollView.backgroundColor=[UIColor clearColor];
        pageScrollView.delegate = self;
        [pageScrollView addSubview:self.imageview];
        [mainScrollView addSubview:pageScrollView];
        [self.pageScrollViewObjArray addObject:pageScrollView];

每当我需要访问scrollview中包含的特定imageview时,我会这样做: -

UIScrollView *sv=(UIScrollView*)[self.pageScrollViewObjArray objectAtIndex:swipeCounter];
sv.zoomScale=1.0f;

但正如我之前所说,我不知道这段代码的效率如何,但已经超过一个月的时间,应用程序已经存储并正在进行测试,但由于这一点没有问题。