捏放大到 UITableViewCell 内的 UIImageView

Posted

技术标签:

【中文标题】捏放大到 UITableViewCell 内的 UIImageView【英文标题】:Pinch Zoom into UIImageView inside a UITableViewCell 【发布时间】:2015-02-25 17:53:56 【问题描述】:

我正在创建一个表格视图,我将在 UITableViewCell 内有一个UIImageView,我希望允许用户放大。我已经能够在UIScrollView 中创建这种效果,但是很难让它正确放大到单个UITableViewCell

在底部我包含了适用于UIScrollView 的代码。挑战从返回 viewForZoomingInScrollView 的内容开始。如果我尝试从单元格中给这个方法UIImageView 它会抛出一个错误,因为它似乎在加载表之前调用了viewForZoomingInScrollView,因此它找不到我正在引用的单元格。如果我通过整个视图本身self.view 我可以滚动但整个表格视图被缩放(我想缩放单元格内的UIImageView)并且当我释放缩放时我得到一个错误Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer bounds contains NaN: [nan nan; 375 667] 这是显然不是正确的道路。

如有任何帮助或指导,我们将不胜感激。

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

return self.imageView;




- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
[self centerScrollViewContents];




- (void)centerScrollViewContents 

CGSize boundsSize = zoomTable.bounds.size;
CGRect contentsFrame = self.imageView.frame;


if (contentsFrame.size.width < boundsSize.width) 
    contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
 else 
    contentsFrame.origin.x = 0.0f;


if (contentsFrame.size.height < boundsSize.height) 
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
 else 
    contentsFrame.origin.y = 0.0f;


self.imageView.frame = contentsFrame;

【问题讨论】:

UITableView 在构建时并未考虑到缩放。实现-viewForZoomingInScrollView: 只会让你头疼。 【参考方案1】:

在我看来,您似乎想要 Facebook 或 Twitter 所拥有的东西,您在其中点击图像,它会缩放以适应屏幕。

您需要做的是将其视为导航步骤 - 即在概念上类似于您在标准表格视图中选择一行并将新视图控制器推送到导航控制器堆栈时发生的情况,除了您可能想使用自定义转换以模态方式呈现。

在简单的情况下,这意味着将点击手势识别器添加到单元格的图像视图中;为了获得完整的效果,您可以添加一个捏合手势识别器来进行交互式过渡。

我建议观看以下 WWDC 视频:

2013 年第 218 届会议“使用视图控制器的自定义转换” 2014 年第 214 届会议“ios 8 中的视图控制器改进” 2014 年第 228 届会议“深入了解演示控制器”

【讨论】:

感谢您的回复和指导。我现在实际上是从表格视图到在转换期间缩放图像的新视图控制器执行此操作。我试图进一步推动它并允许在不额外点击的情况下进行缩放,但我所看到的一切似乎都不支持该功能。【参考方案2】:

从你的问题我的理解是你想为 ImageView 实现放大和缩小的功能。您首先在一个示例中实现了这一点,其中您在 ViewController 中有一个 ScrollView,然后在该 ScrollView 中有一个 ImageView。事情按预期为您工作。但是,当您想要在 TableViewCell 中使用相同的功能时,事情就不适合您了。

所以,我建议你在 ScrollView 中使用 View 作为 ZoomView,并且 ZoomView 应该将 ImageView 作为子视图。并在方法中返回该 ZoomView:

- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView return self.ZoomView;

【讨论】:

以上是关于捏放大到 UITableViewCell 内的 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

在滚动视图内的 UIImageView 上捏缩放效果?

UIScrollView 捏放大到 CGContextStrokePath 而不改变线宽

在单个视图上捏放大多个图像 (Swift)

UITableViewCell 内的 UIScrollView - 水平滚动

如何在自定义相机中实现“捏放大”

黑莓级联捏放大