【问题标题】:iOS scroll view subviewsiOS 滚动视图子视图
【发布时间】:2012-06-06 18:34:18
【问题描述】:

我在 IB 中添加了 3 个滚动视图,然后在 viewDidLoad 中调用了一个方法,将 UIImageView 添加到每个子视图。我想放大每个子视图,所以我使用

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

return [scrollView.subviews objectAtIndex:0];
}

但是 viewForZoomingInScrollView 在图像视图被添加到子视图之前被调用。怎么解决?

这是 loadImages 方法:

-(void) loadImages{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *imageData1 = [defaults dataForKey:@"image1"];
NSData *imageData2 = [defaults dataForKey:@"image2"];
NSData *imageData3 = [defaults dataForKey:@"image3"];
UIImage *img1 = [UIImage imageWithData:imageData1];
UIImage *img2 = [UIImage imageWithData:imageData2];
UIImage *img3 = [UIImage imageWithData:imageData3];

[self loadImage:img1 toScrollView:scrollViewTop];
[self loadImage:img2 toScrollView:scrollViewLeft];
[self loadImage:img3 toScrollView:scrollViewRight];
}

-(void) loadImage:(UIImage *)image toScrollView:(UIScrollView *)scrollView
{
//scale and rotate image to default
UIImage *scaledImage = scaleAndRotateImage(image);

//create imageview and add image to the view
UIImageView *imageView = [[UIImageView alloc]initWithImage:scaledImage];

CGFloat imageWidth = scaledImage.size.width;
CGFloat imageHeight = scaledImage.size.height;

int scrollWidth = scrollView.frame.size.width;
int scrollHeight = scrollView.frame.size.height;

//Limit by width or height, depending on which is smaller in relation to
//the scrollview dimension.
float scaleX = scrollWidth / imageWidth;
float scaleY = scrollHeight / imageHeight;
float scaleScroll =  (scaleX < scaleY ? scaleY : scaleX);

// scrollView.bounds = CGRectMake(0, 0,imageWidth , imageHeight );
//scrollView.frame = CGRectMake(0, 0, scrollWidth, scrollHeight);

scrollView.delegate = self;

scrollView.contentSize = imageView.frame.size;
scrollView.pagingEnabled = NO;
scrollView.maximumZoomScale = scaleScroll*3;
scrollView.minimumZoomScale = scaleScroll;
scrollView.zoomScale = scaleScroll;

[scrollView addSubview:imageView];

}

【问题讨论】:

  • 你在哪里(以什么方法)添加 suview ImageViews
  • 如果我添加 'NSLog@("%@",[scrollView.subviews objectAtIndex:0]);'添加子视图后,它返回正确的数据。但是 viewForZoomingInScrollView 方法是在加载之前调用的
  • 你从哪里调用 loadImages?
  • 哦,viewDidLoad,不过这是我的问题。应该在哪里调用?
  • 有趣的是,如果我在做这样的事情,我可能会在 IB 中定义 UIImageView 对象,以图形方式将它们添加到正确的 UIScrollView 对象中。通过这种方式,您也许可以解决您的问题。您仍然可以在代码中引入图像,但将 UIImageViews 添加到 Interface Builder 中的 ScrollViews 中可能会更容易(特别是如果您想要处理静态的 3 个滚动视图,每个滚动视图只有一个图像视图)。

标签: ios uiscrollview uiimageview


【解决方案1】:

在配置缩放之前尝试将图像视图添加为子视图。说,在委托分配之前。

viewForZoomingInScrollView: 被滚动视图的设置器之一调用;从那里查看堆栈跟踪应该会告诉您是哪一个。

【讨论】:

  • 你说的听起来不错,但我不知道如何改变它。我在 Interface Builder 中构建了滚动视图,并以编程方式为每个视图添加了一个 UIImageView。另外,我不确定如何堆栈跟踪错误。谢谢!
  • 走这条线“scrollView.delegate = self;”并将其放在“[scrollView addSubview:imageView];”下面在你的 loadImage 例程中就是 Wilbur 所说的!
  • 实际上我的意思是将[scrollView addSubview:imageView]; 移动到scrollView.delegate = self; 上方,因为这也会将它移动到缩放设置器上方,但它可能会以任何一种方式工作。要查看堆栈跟踪,请通过单击 viewForZoomingInScrollView: 方法内的行号在 Xcode 中添加断点,然后运行您的应用程序。一旦应用程序到达该行代码,应用程序将暂停,堆栈跟踪将出现在 Xcode 的左侧边栏中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 2010-10-28
相关资源
最近更新 更多