IOS 13 рдореЗрдВ рдкреНрд░рд╕рдВрдЧ рдореЗрдиреВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░, рдореЗрд░рд╛ рдирд╛рдо рдбреЗрдирд┐рд╕ рд╣реИ, рд╣рдо iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди - Apphud рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рджрд╕реНрдпрддрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗрд╡рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред


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



рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдирд╛ рд╕реАрдЦреЗрдВрдЧреЗред


рд╕рдВрджрд░реНрдн рдореЗрдиреВ "рдкреАрдХ рдПрдВрдб рдкреЙрдк" рддрдХрдиреАрдХ рдХрд╛ рдПрдХ рддрд╛рд░реНрдХрд┐рдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рддрддреНрд╡ рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рджрдмрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдмреАрдЪ рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВред


  • рдЖрдИрдУрдПрд╕ 13 рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рдЙрдкрдХрд░рдг рдкрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ 3 рдбреА рдЯрдЪ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА iPad рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


  • рдмрдЯрди рдЬреЛ рдЖрдкрдХреЛ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред



рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдмрд╕ рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рдкрд░ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдкрдХрдбрд╝рдиреА рд╣реЛрдЧреА рдпрд╛ рдЗрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реЗ рджрдмрд╛рдПрдВ (рдпрджрд┐ рдбрд┐рд╡рд╛рдЗрд╕ 3 рдбреА рдЯрдЪ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)ред


рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ


рдРрдкреНрдкрд▓ рдХреЗ рдорд╛рдирд╡ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЗрди рджрд┐рд╢рд╛рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВред


рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд░реЗрдВ


рдпрджрд┐ рдЖрдк рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреБрдЫ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрдиреВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЛрдВ рдореЗрдВ рд╕рдорд╛рди рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рддрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЛрдЪреЗрдВрдЧреЗ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред


рдореЗрдиреВ рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ


рд╕рдВрджрд░реНрдн рдореЗрдиреВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЬрдЧрд╣ рд╣реИред "рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░" рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд╛рдХреНрдпрд╛рдВрд╢ рд╣реИред рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдм рдХреБрдЫ рди рдЬреЛрдбрд╝реЗрдВред


рд╕рдмрдореЗрдирд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрдореЗрдирд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЛ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдирд╛рдо рджреЗрдВред


рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреЗ 1 рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ


рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕рдмрдореЗрдирд╕ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡реЗ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реЗрдм 1 рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╢рд┐рдХрд╛рд░ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдмрд╕реЗ рдКрдкрд░ рд░рдЦреЗрдВ


рд▓реЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдореЗрдиреВ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдЖрд╕рд╛рди рд╣реИред


рдЧреНрд░реБрдкрд┐рдВрдЧ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВ


рд╕рдореВрд╣ рд╕рдорд╛рди рдореЗрдиреВ рдЖрдЗрдЯрдо


рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рд╣реА рдЖрдЗрдЯрдо рдкрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдФрд░ рд╕рдВрдкрд╛рджрди рдореЗрдиреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪреЗрдВ


рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕рдВрдШрд░реНрд╖ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд▓рдВрдмреЗ рдЯреИрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


IOS рдореЗрдиреВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ


рдореЗрдиреВ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ "рдУрдкрди" рдмрдЯрди рди рдЬреЛрдбрд╝реЗрдВ


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдЙрд╕ рдкрд░ рдЯреИрдк рдХрд░рдХреЗ рдПрдХ рдЖрдЗрдЯрдо рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд "рдУрдкрди" рдмрдЯрди рд╢рд╛рдирджрд╛рд░ рд╣реЛрдЧрд╛ред


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 // Put button handler here } return configuration } } 

рдпрджрд┐ рдЗрд╕ рд╡рд┐рдзрд┐ рдореЗрдВ 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 // Creating Save button let save = UIAction(__title: "Save", image: UIImage(systemName: "tray.and.arrow.down.fill"), options: []) { action in // Just showing some alert self.showAlert(title: action.title) } // Creating Rotate button let rotate = UIAction(__title: "Rotate", image: UIImage(systemName: "arrow.counterclockwise"), options: []) { action in self.showAlert(title: action.title) } // Creating Delete button let delete = UIAction(__title: "Delete", image: UIImage(systemName: "trash.fill"), options: .destructive) { action in self.showAlert(title: action.title) } // Creating Edit, which will open Submenu let edit = UIMenu<UIAction>.create(title: "Edit...", children: [rotate, delete]) // Creating main context menu return UIMenu<UIAction>.create(title: "Menu", children: [save, edit]) } return configuration } 

рдпрд╣рд╛рдВ рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ "рд╕рд╣реЗрдЬреЗрдВ", "рдШреБрдорд╛рдПрдВ" рдФрд░ "рд╣рдЯрд╛рдПрдВ" рдмрдЯрди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЕрдВрддрд┐рдо рджреЛ рдХреЛ "рдПрдбрд┐рдЯ ..." рд╕рдмрдореЗрдиреВ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдореБрдЦреНрдп рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред


рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ 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 // Put button handler here } return UIMenu<UIAction>.create(title: "Menu", children: [action]) } return configuration } 

рдпрд╣рд╛рдВ, рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рддрддреНрд╡ рдФрд░ рдореЗрдиреВ рд╕реНрд╡рдпрдВ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдм, рдПрдХ рд╕реЗрд▓ рдкрд░ рдПрдХ рд▓рдВрдмреЗ (рдордЬрдмреВрдд) рдХреНрд▓рд┐рдХ рдХреЗ рд╕рд╛рде, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред


рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреЛ 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 // Put button handler here } return UIMenu<UIAction>.create(title: "Menu", children: [action]) } return configuration } 

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:



рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ 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 // Return Preview View Controller here return PreviewViewController.controller() }) { _ -> UIMenu<UIAction>? in let action = UIAction(__title: "Custom action", image: nil, options: []) { action in // Put button handler here } return UIMenu<UIAction>.create(title: "Menu", children: [action]) } return configuration } } 

рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, PreviewViewController рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрд╣ рдЗрд╕ ViewController рдкрд░ рдХреНрд▓рд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, UITableViewDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ willCommitMenuWithAnimator рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╣реА animator.addCompletion рдЕрдВрджрд░ рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛:


 override func tableView(_ tableView: UITableView, willCommitMenuWithAnimator animator: UIContextMenuInteractionCommitAnimating) { animator.addCompletion { // Put handler here } } 

рдирд┐рд╖реНрдХрд░реНрд╖


рдкреНрд░рд╕рдВрдЧ рдореЗрдиреВ рдЖрдкрдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИред рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ iOS 13 рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдиреЗ рддрдХ рддрд░реАрдХреЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред


10 рдорд┐рдирдЯ рдореЗрдВ рдЕрдкрдиреЗ iOS рдРрдк рдореЗрдВ рд╕рдмреНрд╕рдХреНрд░рд┐рдкреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? Apphud рдФрд░ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ:
  • рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦрд░реАрджрд╛рд░реА рдХрд░реЗрдВ;
  • рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ;
  • рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рджрд╕реНрдпрддрд╛ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд╛рдиреАрдп рдореБрджреНрд░рд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╕рджрд╕реНрдпрддрд╛ рдШрдЯрдирд╛рдУрдВ, рдорд┐рдХреНрд╕рдкреИрдирд▓, рд╕реНрд▓реИрдХ рдФрд░ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреЛ рднреЗрдЬреЗрдВ;
  • рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдордВрдерди рджрд░ рдШрдЯрд╛рдПрдВ рдФрд░ рдмрд┐рдирд╛ рд╕рджрд╕реНрдпрддрд╛ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдВред


рдХреНрдпрд╛ рдкрдврд╝рдирд╛ рд╣реИ?


Source: https://habr.com/ru/post/hi455854/


All Articles