рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░, рдореЗрд░рд╛ рдирд╛рдо рдбреЗрдирд┐рд╕ рд╣реИ, рд╣рдо iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди - Apphud рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рджрд╕реНрдпрддрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗрд╡рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред
WWDC 2019 рдореЗрдВ, Apple рдиреЗ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рдкреЗрд╢ рдХрд┐рдпрд╛: рд╕рдВрджрд░реНрдн рдореЗрдиреВ ред рд╡реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдирд╛ рд╕реАрдЦреЗрдВрдЧреЗред
рд╕рдВрджрд░реНрдн рдореЗрдиреВ "рдкреАрдХ рдПрдВрдб рдкреЙрдк" рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рддрддреНрд╡ рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рджрдмрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмреАрдЪ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВред
рдЖрдИрдУрдПрд╕ 13 рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЙрдкрдХрд░рдг рдкрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ 3 рдбреА рдЯрдЪ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА iPad рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдмрдЯрди рдЬреЛ рдЖрдкрдХреЛ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рдкрд░ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдкрдХрдбрд╝рдиреА рд╣реЛрдЧреА рдпрд╛ рдЗрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рджрдмрд╛рдПрдВ (рдпрджрд┐ рдбрд┐рд╡рд╛рдЗрд╕ 3 рдбреА рдЯрдЪ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)ред
рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ
рдРрдкреНрдкрд▓ рдХреЗ рдорд╛рдирд╡ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЗрди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░реЗрдВ
рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдиреВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЛрдВ рдореЗрдВ рд╕рдорд╛рди рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЛрдЪреЗрдВрдЧреЗ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдореЗрдиреВ рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
рд╕рдВрджрд░реНрдн рдореЗрдиреВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЬрдЧрд╣ рд╣реИред "рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░" рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдм рдХреБрдЫ рди рдЬреЛрдбрд╝реЗрдВред
рд╕рдмрдореЗрдирд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрдореЗрдирд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЛ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╛рдо рджреЗрдВред
рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕рдмрдореЗрдирд╕ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реЗрдм 1 рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдмрд╕реЗ рдКрдкрд░ рд░рдЦреЗрдВ
рд▓реЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдореЗрдиреВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИред
рдЧреНрд░реБрдкрд┐рдВрдЧ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ
рд╕рдореВрд╣ рд╕рдорд╛рди рдореЗрдиреВ рдЖрдЗрдЯрдо
рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдЖрдЗрдЯрдо рдкрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдФрд░ рд╕рдВрдкрд╛рджрди рдореЗрдиреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ
рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд▓рдВрдмреЗ рдЯреИрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореЗрдиреВ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ "рдУрдкрди" рдмрдЯрди рди рдЬреЛрдбрд╝реЗрдВ
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдЙрд╕ рдкрд░ рдЯреИрдк рдХрд░рдХреЗ рдПрдХ рдЖрдЗрдЯрдо рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд "рдУрдкрди" рдмрдЯрди рд╢рд╛рдирджрд╛рд░ рд╣реЛрдЧрд╛ред
UIView рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рдВрджрд░реНрдн рдореЗрдиреВ
рдЕрдм рдЬрдм рд╣рдордиреЗ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдпрдо рд╕реАрдЦ рд▓рд┐рдП рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдЕрднреНрдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдмреЗрд╢рдХ, рдореЗрдиреВ рдХреЗрд╡рд▓ iOS 13 рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ Xcode 11 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЖрдк рдпрд╣рд╛рдБ Xcode 11 рдХрд╛ рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдКрдкрд░ UIImageView
рдкрд░, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдЬреЛрдбрд╝реЗрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ UIImageView
рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦреЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, viewDidLoad
рд╡рд┐рдзрд┐ рдореЗрдВ:
class SingleViewController: UIViewController { @IBOutlet var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() imageView.isUserInteractionEnabled = true let interaction = UIContextMenuInteraction(delegate: self) imageView.addInteraction(interaction) } }
UIContextMenuInteraction
, UIContextMenuInteraction
рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ UIContextMenuInteraction
рдЬрд╛рддрд╛ UIContextMenuInteraction
ред рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдореЗрдиреВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред рдЪрд▓рд┐рдП рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЗрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВред рдФрд░ addInteraction
рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде addInteraction
рд╣рдо рдЕрдкрдиреЗ рдореЗрдиреВ рдХреЛ рдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдЕрдм рдпрд╣ UIContextMenuInteractionDelegate
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдореЗрдиреВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
extension SingleViewController: UIContextMenuInteractionDelegate { func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? { let configuration = UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { actions -> UIMenu<UIAction>? in let save = UIAction(__title: "My Button", image: nil, options: []) { action in
рдпрджрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ nil
рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░, рд╣рдо UIContextMenuConfiguration
рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рдмрдирд╛рддреЗ рд╕рдордп, рд╣рдо рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
identifier
- рдореЗрдиреВ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ред
previewProvider
рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдХ рд╣реИ рдЬреЛ рдореЗрдиреВ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЖрдЗрдЯрдо рдХреЗ рдмрдЬрд╛рдп рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред
actionProvider
рд╣рдо рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдЖрдЗрдЯрдо рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рддрддреНрд╡ рд╕реНрд╡рдпрдВ рдХрд╣реАрдВ рдирд╣реАрдВ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ: рд╡реЗ рдореЗрдиреВ рдЖрдЗрдЯрдо рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо, рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдЖрдЗрдХрди рдФрд░ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рд╡рд╣ рд╕рдм рд╣реИ!
рдПрдХ рд╕рдмрдореЗрдиреВ рдЬреЛрдбрд╝реЗрдВ
рдЪрд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рджреЛ рдорджреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдиреВ рдЬреЛрдбрд╝реЗрдВ: "рд╕рд╣реЗрдЬреЗрдВ" рдФрд░ "рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ..."ред "рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ ..." рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдПрдХ рд╕рдмрдореЗрдиреВ рдЖрдЗрдЯрдо "рдШреБрдорд╛рдПрдБ" рдФрд░ "рд╣рдЯрд╛рдПрдВ" рдХреЗ рд╕рд╛рде рдЦреБрд▓рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ UIContextMenuInteractionDelegate
рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? { let configuration = UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { actions -> UIMenu<UIAction>? in
рдпрд╣рд╛рдВ рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ "рд╕рд╣реЗрдЬреЗрдВ", "рдШреБрдорд╛рдПрдВ" рдФрд░ "рд╣рдЯрд╛рдПрдВ" рдмрдЯрди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЕрдВрддрд┐рдо рджреЛ рдХреЛ "рдПрдбрд┐рдЯ ..." рд╕рдмрдореЗрдиреВ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдореБрдЦреНрдп рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред
рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ UICollectionView
рдЬреЛрдбрд╝реЗрдВ
рдЖрдЗрдП UICollectionView
рдкрд░ рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдЬреЛрдбрд╝реЗрдВред рд╕реЗрд▓ рдкрд░ рдПрдХ рд▓рдВрдмреЗ рдкреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рддрд░рд╣ "рдкреБрд░рд╛рд▓реЗрдЦ" рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдПрдХ рдореЗрдиреВ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

UICollectionView
рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рд░рд▓ рд╣реИ: рдмрд╕ рд╡реИрдХрд▓реНрдкрд┐рдХ func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration?
рд╡рд┐рдзрд┐ func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration?
UICollectionViewDelegate
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ред рдпрд╣рд╛рдБ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рд╣реИ:
override func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { let configuration = UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { actions -> UIMenu<UIAction>? in let action = UIAction(__title: "Archive", image: UIImage(systemName: "archivebox.fill"), options: .destructive) { action in
рдпрд╣рд╛рдВ, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рддрддреНрд╡ рдФрд░ рдореЗрдиреВ рд╕реНрд╡рдпрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдм, рдПрдХ рд╕реЗрд▓ рдкрд░ рдПрдХ рд▓рдВрдмреЗ (рдордЬрдмреВрдд) рдХреНрд▓рд┐рдХ рдХреЗ рд╕рд╛рде, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ UITableView
рдЬреЛрдбрд╝реЗрдВ
рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ UICollectionView
рд╕рдорд╛рди рд╣реИред рдЖрдкрдХреЛ рдЗрд╕ contextMenuConfigurationForRowAt
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП contextMenuConfigurationForRowAt
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ contextMenuConfigurationForRowAt
рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:
override func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { let configuration = UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { actions -> UIMenu<UIAction>? in let action = UIAction(__title: "Custom action", image: nil, options: []) { action in
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ UIContextMenuConfiguration
рдмрдирд╛рддреЗ рд╕рдордп UIContextMenuConfiguration
рд╡рд╛рдВрдЫрд┐рдд UIViewController
рдХреЛ previewProvider
рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
class PreviewViewController: UIViewController { static func controller() -> PreviewViewController { let storyboard = UIStoryboard(name: "Main", bundle: nil) let controller = storyboard.instantiateViewController(withIdentifier: "PreviewViewController") as! PreviewViewController return controller } } extension TableViewController: UITableViewDelegate { override func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? { let configuration = UIContextMenuConfiguration(identifier: nil, previewProvider: { () -> UIViewController? in
рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, PreviewViewController
рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣ рдЗрд╕ ViewController рдкрд░ рдХреНрд▓рд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, UITableViewDelegate
рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ willCommitMenuWithAnimator
рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╣реА animator.addCompletion
рдЕрдВрджрд░ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛:
override func tableView(_ tableView: UITableView, willCommitMenuWithAnimator animator: UIContextMenuInteractionCommitAnimating) { animator.addCompletion {
рдирд┐рд╖реНрдХрд░реНрд╖
рдкреНрд░рд╕рдВрдЧ рдореЗрдиреВ рдЖрдкрдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ iOS 13 рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рддрдХ рддрд░реАрдХреЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
10 рдорд┐рдирдЯ рдореЗрдВ рдЕрдкрдиреЗ iOS рдРрдк рдореЗрдВ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? Apphud рдФрд░ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ:
- рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦрд░реАрджрд╛рд░реА рдХрд░реЗрдВ;
- рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ;
- рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд╛рдиреАрдп рдореБрджреНрд░рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╕рджрд╕реНрдпрддрд╛ рдШрдЯрдирд╛рдУрдВ, рдорд┐рдХреНрд╕рдкреИрдирд▓, рд╕реНрд▓реИрдХ рдФрд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЛ рднреЗрдЬреЗрдВ;
- рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдордВрдерди рджрд░ рдШрдЯрд╛рдПрдВ рдФрд░ рдмрд┐рдирд╛ рд╕рджрд╕реНрдпрддрд╛ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдВред
рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╣реИ?