Swift - 添加 UIImageView 作为 UIWebView scrollView 的子视图和缩放

Swift - Add UIImageView as subview of UIWebView scrollView and scaling

我有一个 UIWebView,我已经成功地向 UIWebViewscrollView 添加了一个 UIImage 视图,如下所示:

let localUrl = String(format:"%@/%@", PDFFilePath, fileNameGroup)
        let url = NSURL.fileURLWithPath(localUrl)

        panRecognizer = UITapGestureRecognizer(target: self, action: #selector(panDetected))
        pinchRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(pinchDetected))

        panRecognizer.delegate = self
        pinchRecognizer.delegate = self

        webview = UIWebView()
        webview.frame = self.view.bounds
        webview.scrollView.frame = webview.frame

        webview.userInteractionEnabled = true
        webview.scalesPageToFit = true
        webview.becomeFirstResponder()
        webview.delegate = self
        webview.scrollView.delegate = self
        self.view.addSubview(webview)
        webview.loadRequest(NSURLRequest(URL:url))
        webview.gestureRecognizers = [pinchRecognizer, panRecognizer]

let stampView:StampAnnotation = StampAnnotation(imageIcon: UIImage(named: "approved.png"), location: CGPointMake(currentPoint.x, currentPoint.y))
            self.webview.scrollView.addSubview(stampView)

我的 UIWebView scrollView 是可扩展的。现在我正在寻找 UIImageViewStampAnnotation 是一个 class 而 UIImageView 是它的子 class)比例 当 scrollView秤。因此,如果用户放大 scrollViewUIImageView 会变大并保持在固定位置,如果用户缩小,UIImageView 会变小,而 [=18] =] 保持固定位置时变小。

我真的希望这是有道理的。我尝试了以下方法:

func pinchDetected(recognizer:UIPinchGestureRecognizer)
    {

        for views in webview.scrollView.subviews
        {
            if(views.isKindOfClass(UIImageView))
            {
                views.transform = CGAffineTransformScale(views.transform, recognizer.scale, recognizer.scale)
                recognizer.scale = 1
            }
        }

        if(appDelegate.annotationSelected == 0)
        {
            webview.scalesPageToFit = true
        }
        else
        {
            webview.scalesPageToFit = false
        }

    }

但是如果我删除这一行,这没有任何作用:

recognizer.scale = 1

它扩展得太大太快了。我的问题是,如何在 UIWebviewscrollView 滚动时让我的 UIImageView 缩放?

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

这解决了我的问题。

func scrollViewDidZoom(scrollView: UIScrollView) {

    for views in webview.scrollView.subviews
    {
        if(views.isKindOfClass(UIImageView))
        {
            views.transform = CGAffineTransformMakeScale(scrollView.zoomScale, scrollView.zoomScale)
        }
    }

}

不,它没有停留在页面上的固定位置,但我认为这是一个限制问题?

使用scrollViewDidZoom的滚动委托方法:

     func scrollViewDidZoom(scrollView: UIScrollView){
         //Change the subview of scroll frame as per the scroll frame scale
         //rect = initial position & size of the image.<class instance> 
         stampView.frame = CGRectMake((CGRectGetMaxX(rect)-rect.size.width)*webView.scrollView.zoomScale, (CGRectGetMaxY(rect)-rect.size.height)*webView.scrollView.zoomScale, rect.width*webView.scrollView.zoomScale,rect.height*webView.scrollView.zoomScale)
     }

你很接近...

1) 添加一个 属性 以保留 stampViewFrame 的外部引用:

var stampViewFrame = CGRect(x: 100, y: 100, width: 100, height: 100)

2) 将您的 scrollViewDidZoom() 替换为:

 func scrollViewDidZoom(scrollView: UIScrollView) {
    for views in webView.scrollView.subviews
    {
        if(views.isKindOfClass(UIImageView))
        {
            views.frame = CGRect(x: stampViewFrame.origin.x * scrollView.zoomScale, y: stampViewFrame.origin.y * scrollView.zoomScale, width: stampViewFrame.width * scrollView.zoomScale, height: stampViewFrame.height * scrollView.zoomScale)
        }
    }
}

3) 最后,因为在每个新的缩放操作开始时缩放比例重置为 1,所以您需要调整 stampViewFrame 的值 属性:

func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
    stampViewFrame = CGRect(x: stampViewFrame.origin.x * scale, y: stampViewFrame.origin.y * scale, width: stampViewFrame.width * scale, height: stampViewFrame.height * scale)
}

我也试图回答您关于方向更改期间布局的其他问题,但我现在对您要尝试做的事情有了更好的理解。如果您希望您的 stampView 始终处于相对于 网络内容 的相同位置,您必须进入 HTML/JS,因为网页是动态布局的。一个更简单(并且希望足够接近)的解决方案是添加以下内容:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    webView.frame = view.bounds
    stampView.frame = stampViewFrame
}