Swift - 添加 UIImageView 作为 UIWebView scrollView 的子视图和缩放
Swift - Add UIImageView as subview of UIWebView scrollView and scaling
我有一个 UIWebView
,我已经成功地向 UIWebView
的 scrollView
添加了一个 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
是可扩展的。现在我正在寻找 UIImageView
(StampAnnotation
是一个 class 而 UIImageView
是它的子 class)比例 当 scrollView
秤。因此,如果用户放大 scrollView
,UIImageView
会变大并保持在固定位置,如果用户缩小,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
它扩展得太大太快了。我的问题是,如何在 UIWebview
的 scrollView
滚动时让我的 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
}
我有一个 UIWebView
,我已经成功地向 UIWebView
的 scrollView
添加了一个 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
是可扩展的。现在我正在寻找 UIImageView
(StampAnnotation
是一个 class 而 UIImageView
是它的子 class)比例 当 scrollView
秤。因此,如果用户放大 scrollView
,UIImageView
会变大并保持在固定位置,如果用户缩小,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
它扩展得太大太快了。我的问题是,如何在 UIWebview
的 scrollView
滚动时让我的 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
}