UIImageView收缩缩放swift
我希望有人能帮我。我正在尝试允许用户在UIImageView上收缩缩放(允许最大和最小级别)。但由于某些原因,它不能正常工作。图像放大一点,然后反弹回来。多谢各位 这是缩放功能UIImageView收缩缩放swift,swift,uiimageview,uipinchgesturerecognizer,Swift,Uiimageview,Uipinchgesturerecognizer,我希望有人能帮我。我正在尝试允许用户在UIImageView上收缩缩放(允许最大和最小级别)。但由于某些原因,它不能正常工作。图像放大一点,然后反弹回来。多谢各位 这是缩放功能 func zoom(sender:UIPinchGestureRecognizer) { if sender.state == .Ended || sender.state == .Changed { let currentScale = self.view.frame.size.width
func zoom(sender:UIPinchGestureRecognizer) {
if sender.state == .Ended || sender.state == .Changed {
let currentScale = self.view.frame.size.width / self.view.bounds.size.width
var newScale = currentScale*sender.scale
if newScale < 1 {
newScale = 1
}
if newScale > 9 {
newScale = 9
}
let transform = CGAffineTransformMakeScale(newScale, newScale)
self.imageView?.transform = transform
sender.scale = 1
}
}
func缩放(发送方:UIPinchGestureRecognitor){
如果sender.state==.end | | sender.state==.Changed{
让currentScale=self.view.frame.size.width/self.view.bounds.size.width
var newScale=currentScale*sender.scale
如果newScale<1{
newScale=1
}
如果新闻级别>9{
新闻等级=9
}
let transform=CGAffineTransformMakeScale(newScale,newScale)
self.imageView?.transform=transform
sender.scale=1
}
}
我决定将imageView添加到UIScrollView中。它允许用户缩放和平移。这是我使用的代码
为了设置最大/最小缩放,我使用了:
scrollImg.minimumZoomScale = 1.0
scrollImg.maximumZoomScale = 10.0
下面是代码的其余部分
var vWidth = self.view.frame.width
var vHeight = self.view.frame.height
var scrollImg: UIScrollView = UIScrollView()
scrollImg.delegate = self
scrollImg.frame = CGRectMake(0, 0, vWidth!, vHeight!)
scrollImg.backgroundColor = UIColor(red: 90, green: 90, blue: 90, alpha: 0.90)
scrollImg.alwaysBounceVertical = false
scrollImg.alwaysBounceHorizontal = false
scrollImg.showsVerticalScrollIndicator = true
scrollImg.flashScrollIndicators()
scrollImg.minimumZoomScale = 1.0
scrollImg.maximumZoomScale = 10.0
defaultView!.addSubview(scrollImg)
imageView!.layer.cornerRadius = 11.0
imageView!.clipsToBounds = false
scrollImg.addSubview(imageView!)
我还必须补充这一点
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return self.imageView
}
Swift 3及以上功能原型
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return self.mainImage
}
在我看来,问题在于你对当前规模的确定。它始终等于1,因为您更改了imageView的比例。您应按如下方式分配currentScale:
let currentScale = self.imageView?.frame.size.width / self.imageView?.bounds.size.width
您可以使用ImageScrollView开源、可缩放和可滚动的图像视图 与此开源一样,将ImageView添加到ScrollView
open class ImageScrollView: UIScrollView {
var zoomView: UIImageView? = nil
}
extension ImageScrollView: UIScrollViewDelegate{
public func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return zoomView
}
public func scrollViewDidZoom(_ scrollView: UIScrollView) {
adjustFrameToCenter()
}
}
UIImageView使用UIScrollView收缩缩放| |图像缩放ios,使用swift 3和Xcode 8字母
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return self.mainImage
}
在情节提要中设置uiscrollview委托
我认为最大的问题是在
func
的末尾,您有sender.scale=1
。如果你删除了那行代码,你的图像不应该每次都反弹回来。Swift 3解决方案
默认情况下,UIImageView的
userinteraction
被禁用。在UIImageView
中添加任何手势之前,请先启用它
imgView.isUserInteractionEnabled=true
相对于屏幕中两个触摸点的比例因子
坐标
Swift 3解决方案
这是我使用的代码。我将imageView作为子视图添加到scrollView中
class ZoomViewController: UIViewController,UIScrollViewDelegate {
@IBOutlet weak var scrollView:UIScrollView!
@IBOutlet weak var imageView:UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 10.0//maximum zoom scale you want
scrollView.zoomScale = 1.0
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}
我在Swift 3中发布了一个关于缩放功能的答案,包括捏和双击。工作正常。swift 4的选项
class ViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrolView: UIScrollView!
@IBOutlet weak var imgPhoto: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
scrolView.delegate = self
scrolView.minimumZoomScale = 1.0
scrolView.maximumZoomScale = 10.0
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imgPhoto
}
}
这是一个老问题,但我看不到任何解释原始代码错误的答案 这一行:
let currentScale = self.view.frame.size.width / self.view.bounds.size.width
正在处理主视图而不是图像视图,因此比例计算始终为~1
这个简单的更改使其行为符合预期
let currentScale = sender.view!.frame.size.width / sender.view!.bounds.size.width
通过将self更改为sender(并强制view展开),缩放计算按预期工作。我在这里结束,可能是搜索错误的方式 我在contentMode=.center中使用imageView之后。 但我判断它太放大了,我在寻找缩小它的方法。 以下是方法:
self.imageView.contentScaleFactor = 3
1就好像你在做什么。更多1缩小。。。3适用于我,但您需要对其进行测试。使用Swift 5.0,以下是它如何适用于我:
let myImageView = UIImageView(image: myImage)
myImageView.isUserInteractionEnabled = true
let pinchMethod = UIPinchGestureRecognizer(target: self, action: #selector(pinchImage(sender:)))
myImageView.addGestureRecognizer(pinchMethod)
@objc func pinchImage(sender: UIPinchGestureRecognizer) {
guard let sender.view != nil else { return }
if let scale = (sender.view?.transform.scaledBy(x: sender.scale, y: sender.scale)) {
guard scale.a > 1.0 else { return }
guard scale.d > 1.0 else { return }
sender.view?.transform = scale
sender.scale = 1.0
}
}
您可以使用scale.a、scale.b、scale.c、scale.d、scale.tx和scale.ty设置缩放限制。支持Swift 5.1,您可以创建
UIImageView
的扩展,如下所示:
扩展UIImageView{
func enableZoom(){
让pinchGesture=UIPinchGestureRecognizer(目标:自我,操作:#选择器(startZooming(:))
isUserInteractionEnabled=true
AddGestureRecognitor(pinchGesture)
}
@objc
私有函数启动库(uu发送方:UIPinchGestureRecognizer){
设scaleResult=sender.view?.transform.scaledBy(x:sender.scale,y:sender.scale)
guard let scale=scaleResult,scale.a>1,scale.d>1 else{return}
sender.view?.transform=缩放
sender.scale=1
}
}
您可以使用
图像滚动视图
开源、可缩放和可滚动的图像视图。^^这对我来说非常有效,花了大约30秒。谢谢你,马克!这真的就像这篇文章说的一样简单!这应该是Swift 3的公认答案。我尝试过的其他方法都不管用,包括上面接受的答案。没有必要在代码中设置scroll views委托,因为它已经通过故事板进行了设置,如上图所示。我对swift和xcode非常陌生,我尝试在包含图像的tableview中执行相同的操作,每个tablecell都有自己的后端。因此,我试图将委托作为每个tablecell的后端,但它不起作用。按照上面的步骤做了吗,我有什么遗漏吗?回答得很好!我喜欢它的简单性(没有不必要的子类等),而且它在没有故事板的情况下运行良好(只需设置委托并使用添加UIImageView作为UIScrollView的子视图。请尝试清楚地解释…什么是lastScale whats new scale在此,您在哪里声明了它们,它们的子项是什么请在此处添加更多详细信息。代码不完整。什么是lastScale whats new scale在此?结束时如何恢复到原始大小hing@rajeshkumar rwing当pinching结束时,调用scrollView.zoomScale=1.0
工作解决方案,谢谢这个解决方案。可以向左向右滚动吗?@John LimaI认为这是最好的答案。它可以缩放,也可以滚动。此外,它还支持双标签操作。我想再说一件事。它真的很容易使用NTION开发者!!!这是一个完美的答案。这甚至适用于Swift 5,具有非常小的自动更正。请下去查看“akhilendra singh”的答案。这个答案并不完美。
let myImageView = UIImageView(image: myImage)
myImageView.isUserInteractionEnabled = true
let pinchMethod = UIPinchGestureRecognizer(target: self, action: #selector(pinchImage(sender:)))
myImageView.addGestureRecognizer(pinchMethod)
@objc func pinchImage(sender: UIPinchGestureRecognizer) {
guard let sender.view != nil else { return }
if let scale = (sender.view?.transform.scaledBy(x: sender.scale, y: sender.scale)) {
guard scale.a > 1.0 else { return }
guard scale.d > 1.0 else { return }
sender.view?.transform = scale
sender.scale = 1.0
}
}