forked from organicmaps/organicmaps
[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:
parent
a2aa0c9c46
commit
031ddc8318
2 changed files with 126 additions and 40 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue