UIScrollview ContentSize魔术

时间:2013-07-25 07:24:35

标签: iphone ios objective-c uiscrollview uiimageview

我正在双击UIImageView缩放UIScrollView。在Interface Builder中设置时工作正常。我在这里看到的魔力是,contentSize的{​​{1}}在我放大/缩小时自行增加/减少。我检查了scrollView中的contentSize,它不是零。

我尝试从IB中删除viewDidLoadscrollView并以编程方式创建它们。添加imageViewimageView后,我无法在此处进行缩放。当我检查原因时,tapGestureRecognizer到处都是零。

当我在IB / xib中添加它们时,我对contentSize一无所知。我没有把它放在任何地方。我觉得它很好,contentSize会自动调整到我需要的位置。但是,当我以编程方式创建contentSize时,它不会复制。

我怎样才能让它发挥作用?我欢迎你的建议。

这是我的参考代码。

在IB中创建的ScrollView

scrollView

NSLog说

- (void)viewDidLoad {
    [super viewDidLoad];

    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    [doubleTap setNumberOfTapsRequired:2];
    [imageView addGestureRecognizer:doubleTap];
    imageScrollView.minimumZoomScale=1.01;
    imageScrollView.maximumZoomScale=5;
    imageScrollView.zoomScale=1.01;
    NSLog(@"height = %f width = %f", imageScrollView.contentSize.height, imageScrollView.contentSize.width);
}

以编程方式创建的ScrollView

height = 449.479767 width = 320.000000

NSLog说

- (void)viewDidLoad {
    [super viewDidLoad];

    imageScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
    imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
    [doubleTap setNumberOfTapsRequired:2];
    [imageView addGestureRecognizer:doubleTap];
    imageScrollView.minimumZoomScale=1.01;
    imageScrollView.maximumZoomScale=5;
    imageScrollView.zoomScale=1.01;

    [self.view addSubview:imageScrollView];
    [self.imageScrollView addSubview:imageView];
    NSLog(@"height = %f width = %f", imageScrollView.contentSize.height, imageScrollView.contentSize.width);
}

3 个答案:

答案 0 :(得分:1)

这些属性

self.minimumZoomScale=1.01;
self.maximumZoomScale=5;
self.zoomScale=1.01;

应该是scrollView的属性:

imageScrollView.minimumZoomScale=1.01;
imageScrollView.maximumZoomScale=5;
imageScrollView.zoomScale=1.01;

然后你需要设置contentSize属性(当使用IB时,你不需要在从xib文件加载时设置它):

imageScrollView.contentSize = CGSizeMake(width,height);

使用适当的值。

此外,您需要设置委托:

imageScrollView.delegate = self;

并且至少有一个委托方法指示要缩放的子视图:

 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
   return scrollView.subviews[0];
}

(实际上你最好在子视图上设置标签或将其分配给属性以获取对它的引用,因为scrollViews也有内置子视图)

答案 1 :(得分:0)

你的xib是否启用了自动布局?如果是这样,IB在图像视图和滚动视图之间设置约束,并且在运行时自动布局使用约束来设置滚动视图的内容大小。在代码中创建视图时,您没有添加足够的约束而没有直接设置内容大小,因此内容大小保持为零。

阅读Tech note TN2154了解详情。

答案 2 :(得分:0)

@Pheel给出了类似的答案,关于使用编码缩放滚动视图内的图像。

答案的链接如下:

IOS: add imageview in a scrollview to have zoom