使用缩放在 UITableViewCell 中缩放 UIImageView

Posted

技术标签:

【中文标题】使用缩放在 UITableViewCell 中缩放 UIImageView【英文标题】:Zooming UIImageView in UITableViewCell with zoom 【发布时间】:2015-05-20 15:06:05 【问题描述】:

我有以下问题: 我得到了下一个 tableviewcell 架构,

UITableViewCell 容器视图 scrollView(用于缩放 UIImageView) UIImageView

问题是,当我放大 UIImageView 时,它总是反弹到图片的左上角,在任何缩放时。当我缩小时,可以看到缩小到左上角。

无限制,一切以编程方式创建

尝试了我可以在堆栈溢出上找到的所有技术,但没有一个解决它。我认为原因是在 uitableviewcell 中执行此操作有问题。这就是我的 TableViewCell.swift 内部的内容

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.frame = CGRectMake(0, 0, screenWidth, screenWidth)
    self.ImageView.frame = CGRectMake(0,0,screenWidth,screenWidth)
    self.CameraView.frame = CGRectMake(0,0,screenWidth,screenWidth)
    self.ScrollView.frame = CGRectMake(0,0,screenWidth,screenWidth)
    self.addSubview(CameraView)

    //!----Scroll view----//
    ScrollView.delegate = self
    ScrollView.alwaysBounceHorizontal = false
    ScrollView.alwaysBounceVertical = false
    ScrollView.bounces = false
    ScrollView.bouncesZoom = false
    ScrollView.minimumZoomScale = 1.0
    ScrollView.maximumZoomScale = 10.0
    ScrollView.contentSize = CGSizeMake(screenWidth, screenWidth)

    ScrollView.pagingEnabled = false

    var doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "scrollViewDoubleTapped:")
    doubleTapRecognizer.numberOfTapsRequired = 2
    doubleTapRecognizer.numberOfTouchesRequired = 1
    ScrollView.addGestureRecognizer(doubleTapRecognizer)
    self.contentView.addSubview(ScrollView)
    self.ScrollView.addSubview(ImageView)

    var centerPoint = CGPointMake(CGRectGetMidX(self.ScrollView.bounds), CGRectGetMidY(self.ScrollView.bounds))
    ImageView.center = centerPoint
    ScrollView.center = centerPoint
    ImageView.userInteractionEnabled = true
    ImageView.clipsToBounds = false

    centerScrollViewContents()



func centerScrollViewContents()
    var boundsSize:CGSize = self.ScrollView.bounds.size
    var contentsFrame = self.ImageView.frame

    if (contentsFrame.size.width < boundsSize.width)
        contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width)/2
    else
        contentsFrame.origin.x = 0
    

    if (contentsFrame.size.height < boundsSize.height)
        contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2
    else
        contentsFrame.origin.y = 0
    

    self.ImageView.frame = contentsFrame

func scrollViewDoubleTapped(recognizer: UITapGestureRecognizer) 
    // 1
    let pointInView = recognizer.locationInView(ImageView)

    // 2
    var newZoomScale = ScrollView.zoomScale * 1.5
    newZoomScale = min(newZoomScale, ScrollView.maximumZoomScale)

    // 3
    let scrollViewSize = ScrollView.bounds.size
    let w = scrollViewSize.width / newZoomScale
    let h = scrollViewSize.height / newZoomScale
    let x = pointInView.x - (w / 2.0)
    let y = pointInView.y - (h / 2.0)

    let rectToZoomTo = CGRectMake(x, y, w, h);

    // 4
    ScrollView.zoomToRect(rectToZoomTo, animated: true)



func scrollViewDidZoom(scrollView: UIScrollView) 
    centerScrollViewContents()


func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? 
    return self.ImageView

【问题讨论】:

我很确定你必须使用 ios8 的约束来定位项目。通过设置框架位置等,我的代码在 iOS7 上工作时遇到了这个问题,而在 iOS8 上根本不工作。你有没有在 iOS7 上试过,看看会发生什么?如果它在那里工作而不是在 iOS8 上工作,那么你就是你的问题。解决方案是为图像添加左上偏移约束,并在代码中设置约束大小,然后强制布局。 你试过将scrollView或ImageView中的contentMode设置为Center 吗? 试过了,没有帮助。 @RoryMcKinnel 谢谢你的建议,我今天试试这个 @RoryMcKinnel 能否请您向我解释得更详细一些,因为我完全不知道该怎么做。 @GrishaGevorkyan 我想我误读了你的问题。再看一遍,您的代码似乎都来自以下教程,您正试图将其添加到表格单元格中:raywenderlich.com/76436/…。你最好的办法是让教程代码工作,然后用它来调试你的调整,看看有什么不同。我会将您的单元格剥离回最小的图像视图并使其正常工作。您似乎将 CameraView 添加到单元格视图而不是其内容视图中,这可能是一个问题? 【参考方案1】:

您的方案的最佳解决方案是在 ScrollView 中添加一个 View(zoomView) 作为 UIImageView 的父级,然后不添加手势,只需从方法 func viewForZooming(in scrollView: UIScrollView) -&gt; UIView? 返回 zoomViev。 然后在重新加载 tableView 时保持缩放级别,将 ScrollView 的 zoomLevel 存储在方法 func scrollViewDidZoom(_ scrollView: UIScrollView) 中,并在 cellForRowAtIndexPath 方法中使用存储的 zoomLevel

【讨论】:

以上是关于使用缩放在 UITableViewCell 中缩放 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

在缩放时,使用UIWebView scrollView更新UITableViewCell中的约束无法正常工作

UITableViewCell backgroundView 图像调整大小?

像Instagram这样的图像滑块?

我们可以在 Android 中使用缩放手势检测器进行缩放吗?

变焦比。在 CSS3 中缩放

自定义 UITableViewCell 的高度