使用缩放在 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) -> UIView?
返回 zoomViev。
然后在重新加载 tableView 时保持缩放级别,将 ScrollView 的 zoomLevel 存储在方法 func scrollViewDidZoom(_ scrollView: UIScrollView)
中,并在 cellForRowAtIndexPath 方法中使用存储的 zoomLevel
【讨论】:
以上是关于使用缩放在 UITableViewCell 中缩放 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章
在缩放时,使用UIWebView scrollView更新UITableViewCell中的约束无法正常工作
UITableViewCell backgroundView 图像调整大小?