[ios] change the content copying from context menu to long tap and toast message

Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
This commit is contained in:
Kiryl Kaveryn 2023-12-23 18:15:08 +04:00 committed by Alexander Borsuk
parent a2aa0c9c46
commit 031ddc8318
2 changed files with 126 additions and 40 deletions

View file

@ -12,6 +12,8 @@ class InfoItemViewController: UIViewController {
@IBOutlet var tapGestureRecognizer: UITapGestureRecognizer!
var tapHandler: TapHandler?
var longPressHandler: TapHandler?
var style: Style = .regular {
didSet {
switch style {
@ -24,17 +26,14 @@ class InfoItemViewController: UIViewController {
}
}
}
var canShowMenu = false
@IBAction func onTap(_ sender: UITapGestureRecognizer) {
tapHandler?()
}
@IBAction func onLongPress(_ sender: UILongPressGestureRecognizer) {
guard sender.state == .began, canShowMenu else { return }
let menuController = UIMenuController.shared
menuController.setTargetRect(infoLabel.frame, in: self.view)
infoLabel.becomeFirstResponder()
menuController.setMenuVisible(true, animated: true)
guard sender.state == .began else { return }
longPressHandler?()
}
override func viewDidLoad() {
@ -59,6 +58,7 @@ protocol PlacePageInfoViewControllerDelegate: AnyObject {
func didPressVk()
func didPressLine()
func didPressEmail()
func didCopy(_ content: String)
}
class PlacePageInfoViewController: UIViewController {
@ -127,9 +127,15 @@ class PlacePageInfoViewController: UIViewController {
if let phoneUrl = placePageInfoData.phoneUrl, UIApplication.shared.canOpenURL(phoneUrl) {
cellStyle = .link
}
phoneView = createInfoItem(phone, icon: UIImage(named: "ic_placepage_phone_number"), style: cellStyle) { [weak self] in
phoneView = createInfoItem(phone,
icon: UIImage(named: "ic_placepage_phone_number"),
style: cellStyle,
tapHandler: { [weak self] in
self?.delegate?.didPressCall()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(phone)
})
}
if let ppOperator = placePageInfoData.ppOperator {
@ -138,21 +144,39 @@ class PlacePageInfoViewController: UIViewController {
if let website = placePageInfoData.website {
// Strip website url only when the value is displayed, to avoid issues when it's opened or edited.
websiteView = createInfoItem(stripUrl(str: website), icon: UIImage(named: "ic_placepage_website"), style: .link) { [weak self] in
websiteView = createInfoItem(stripUrl(str: website),
icon: UIImage(named: "ic_placepage_website"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressWebsite()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(website)
})
}
if placePageInfoData.wikipedia != nil {
wikipediaView = createInfoItem(L("read_in_wikipedia"), icon: UIImage(named: "ic_placepage_wiki"), style: .link) { [weak self] in
if let wikipedia = placePageInfoData.wikipedia {
wikipediaView = createInfoItem(L("read_in_wikipedia"),
icon: UIImage(named: "ic_placepage_wiki"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressWikipedia()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(wikipedia)
})
}
if placePageInfoData.wikimediaCommons != nil {
wikimediaCommonsView = createInfoItem(L("wikimedia_commons"), icon: UIImage(named: "ic_placepage_wikimedia_commons"), style: .link) { [weak self] in
if let wikimediaCommons = placePageInfoData.wikimediaCommons {
wikimediaCommonsView = createInfoItem(L("wikimedia_commons"),
icon: UIImage(named: "ic_placepage_wikimedia_commons"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressWikimediaCommons()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(wikimediaCommons)
})
}
if let wifi = placePageInfoData.wifiAvailable {
@ -168,50 +192,99 @@ class PlacePageInfoViewController: UIViewController {
}
if let email = placePageInfoData.email {
emailView = createInfoItem(email, icon: UIImage(named: "ic_placepage_email"), style: .link) { [weak self] in
emailView = createInfoItem(email,
icon: UIImage(named: "ic_placepage_email"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressEmail()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(email)
})
}
if let facebook = placePageInfoData.facebook {
facebookView = createInfoItem(facebook, icon: UIImage(named: "ic_placepage_facebook"), style: .link) { [weak self] in
facebookView = createInfoItem(facebook,
icon: UIImage(named: "ic_placepage_facebook"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressFacebook()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(facebook)
})
}
if let instagram = placePageInfoData.instagram {
instagramView = createInfoItem(instagram, icon: UIImage(named: "ic_placepage_instagram"), style: .link) { [weak self] in
instagramView = createInfoItem(instagram,
icon: UIImage(named: "ic_placepage_instagram"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressInstagram()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(instagram)
})
}
if let twitter = placePageInfoData.twitter {
twitterView = createInfoItem(twitter, icon: UIImage(named: "ic_placepage_twitter"), style: .link) { [weak self] in
twitterView = createInfoItem(twitter,
icon: UIImage(named: "ic_placepage_twitter"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressTwitter()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(twitter)
})
}
if let vk = placePageInfoData.vk {
vkView = createInfoItem(vk, icon: UIImage(named: "ic_placepage_vk"), style: .link) { [weak self] in
vkView = createInfoItem(vk,
icon: UIImage(named: "ic_placepage_vk"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressVk()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(vk)
})
}
if let line = placePageInfoData.line {
lineView = createInfoItem(line, icon: UIImage(named: "ic_placepage_line"), style: .link) { [weak self] in
lineView = createInfoItem(line,
icon: UIImage(named: "ic_placepage_line"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressLine()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(line)
})
}
if let address = placePageInfoData.address {
addressView = createInfoItem(address, icon: UIImage(named: "ic_placepage_adress"))
addressView?.canShowMenu = true
}
if placePageInfoData.kayak != nil {
kayakView = createInfoItem(L("more_on_kayak"), icon: UIImage(named: "ic_placepage_kayak"), style: .link) { [weak self] in
if let address = placePageInfoData.address {
addressView = createInfoItem(address,
icon: UIImage(named: "ic_placepage_adress"),
longPressHandler: { [weak self] in
self?.delegate?.didCopy(address)
})
}
if let kayak = placePageInfoData.kayak {
kayakView = createInfoItem(L("more_on_kayak"),
icon: UIImage(named: "ic_placepage_kayak"),
style: .link,
tapHandler: { [weak self] in
self?.delegate?.didPressKayak()
}
},
longPressHandler: { [weak self] in
self?.delegate?.didCopy(kayak)
})
}
var formatId = self.coordinatesFormatId
@ -220,17 +293,21 @@ class PlacePageInfoViewController: UIViewController {
formatId = 0
}
coordinatesView = createInfoItem(coordFormats[formatId], icon: UIImage(named: "ic_placepage_coordinate")) {
[unowned self] in
coordinatesView = createInfoItem(coordFormats[formatId],
icon: UIImage(named: "ic_placepage_coordinate"),
tapHandler: { [unowned self] in
let formatId = (self.coordinatesFormatId + 1) % coordFormats.count
self.coordinatesFormatId = formatId
let coordinates:String = coordFormats[formatId]
let coordinates: String = coordFormats[formatId]
self.coordinatesView?.infoLabel.text = coordinates
}
},
longPressHandler: { [unowned self] in
let coordinates: String = coordFormats[self.coordinatesFormatId]
self.delegate?.didCopy(coordinates)
})
coordinatesView?.accessoryImage.image = UIImage(named: "ic_placepage_change")
coordinatesView?.accessoryImage.isHidden = false
coordinatesView?.canShowMenu = true
}
}
@ -238,13 +315,15 @@ class PlacePageInfoViewController: UIViewController {
private func createInfoItem(_ info: String,
icon: UIImage?,
style: Style = .regular,
tapHandler: TapHandler? = nil) -> InfoItemViewController {
tapHandler: TapHandler? = nil,
longPressHandler: TapHandler? = nil) -> InfoItemViewController {
let vc = storyboard!.instantiateViewController(ofType: InfoItemViewController.self)
addToStack(vc)
vc.imageView.image = icon
vc.infoLabel.text = info
vc.style = style
vc.tapHandler = tapHandler
vc.longPressHandler = longPressHandler
return vc;
}

View file

@ -80,6 +80,13 @@ extension PlacePageInteractor: PlacePageInfoViewControllerDelegate {
func didPressEmail() {
MWMPlacePageManagerHelper.openEmail(placePageData)
}
func didCopy(_ content: String) {
UIPasteboard.general.string = content
let message = String(format: L("copied_to_clipboard"), content)
UIImpactFeedbackGenerator(style: .medium).impactOccurred()
Toast.toast(withText: message).show(withAlignment: .bottom)
}
}
// MARK: - WikiDescriptionViewControllerDelegate