Если у вас есть UIScrollView
, который вы можете увеличить, и вы добавляете взаимодействие с контекстным меню iOS 13 к представлению внутри представления с прокруткой (например, a UIImageView
), когда вы выполняете взаимодействие странно мгновенно увеличивает масштаб изображения, затем уменьшает его, поэтому покажите контекстное меню, а затем, выйдя из этого контекстного меню, изображение будет увеличено очень далеко. Кажется, что он выходит за пределы UIImageView.
StackOverflow не поддерживает встраивание видео / GIF-файлов, поэтому вот его видео на Imgur показывает, что я имею в виду: https://imgur.com/mAzWlJA
Есть ли способ предотвратить такое поведение? Например, в WKWebView
(подкласс UIScrollView
) длительное нажатие на изображение не демонстрирует такого поведения.
Вот простой код для демонстрации его примера, если вы хотите проверить его в простой новый проект Xcode:
import UIKit
class RootViewController: UIViewController, UIScrollViewDelegate, UIContextMenuInteractionDelegate {
let scrollView = UIScrollView()
let imageView = UIImageView(image: UIImage(named: "cat.jpg")!)
override func viewDidLoad() {
super.viewDidLoad()
[view, scrollView].forEach { $0.backgroundColor = .black }
scrollView.delegate = self
scrollView.frame = view.bounds
scrollView.addSubview(imageView)
scrollView.contentSize = imageView.frame.size
view.addSubview(scrollView)
// Set zoom scale
let scaleToFit = min(scrollView.bounds.width / imageView.bounds.width, scrollView.bounds.height / imageView.bounds.height)
scrollView.maximumZoomScale = max(1.0, scaleToFit)
scrollView.minimumZoomScale = scaleToFit < 1.0 ? scaleToFit : 1.0
scrollView.zoomScale = scaleToFit
// Add context menu support
imageView.isUserInteractionEnabled = true
imageView.addInteraction(UIContextMenuInteraction(delegate: self))
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.frame = view.bounds
}
// MARK: - UIScrollView
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}
// MARK: - Context Menus
func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
return UIContextMenuConfiguration(identifier: nil, previewProvider: { () -> UIViewController? in
return nil
}) { (suggestedElements) -> UIMenu? in
var children: [UIAction] = []
children.append(UIAction(title: "Upvote", image: UIImage(systemName: "arrow.up")) { (action) in
})
children.append(UIAction(title: "Downvote", image: UIImage(systemName: "arrow.down")) { (action) in
})
return UIMenu(title: "", image: nil, identifier: nil, options: [], children: children)
}
}
}
А вот cat.jpg
, если вам это тоже понравится: https://imgur.com/hTTZaw4