UITableViewRowAction рдФрд░ UIContextualAction рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди



рдХрдИ рдХреЛ UITableViewCell рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрдВрджрд░ рдмрдЯрди рдореИрдкрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрдм рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдХреБрдЫ рдиреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░", рдЕрдиреНрдп рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрд┐рдд рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ UITableViewRowAction рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЕрдиреБрдХреВрд▓рди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд┐рджреНрдзрд╛рдВрдд: UITableViewRowAction рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЗрд╕ рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕реЗрд▓ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ (рдЬреИрд╕реЗ "рдбрд┐рд▓реАрдЯ", "рдкрд░рд┐рд╡рд░реНрддрди", рдЖрджрд┐) рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдкрд╛рда, рд╢реИрд▓реА рдФрд░ рдПрдХ рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред IOS SDK рд╣рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ UITableViewRowAction рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:

public convenience init(style: UITableViewRowActionStyle, title: String?, handler: @escaping (UITableViewRowAction, IndexPath) -> Swift.Void) 

рдЖрдк BackgroundColor рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореМрдЬреВрджрд╛ рддрд░реАрдХреЗред


рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдпрд╛ рдореБрдЭреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреНрдпрд╛ рдорд┐рд▓рд╛ред
рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 1 ред рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░"ред рдпрд╣ рдкрд╛рда рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдФрд░ рдЙрдмрд╛рдК рд▓рдЧрддрд╛ рд╣реИ:


рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 2 ред UIColor (patternImage: UIImage) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реЗрдЯ рдХрд░реЗрдВред рдпрд╣ рд╕реБрдВрджрд░рддрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рдХреЛ рд╡рдВрдЪрд┐рдд рдХрд░реЗрдЧрд╛, рдХрдИ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдФрд░ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЪреВрдВрдХрд┐ UITableViewRowAction рдХреА рдЪреМрдбрд╝рд╛рдИ рдкрд╛рда рдХреЗ рдЖрдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╢реАрд░реНрд╖рдХ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╕рдлреЗрдж рд╕реНрдерд╛рди рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЧрддрд┐рд╢реАрд▓ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рд╡рд╛рд▓реЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рд╕реЗрд▓ рдКрдВрдЪрд╛рдИ рдореЗрдВ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:



рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 3 ред рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдкрд╛рда рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд┐рдзрд┐ рдЧрддрд┐рд╢реАрд▓ рдКрдВрдЪрд╛рдИ рд╡рд╛рд▓реЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ:



рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдЖрдЗрдХрди рдХреЗ рддрд╣рдд рдкрд╛рда рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рд╣рдорд╛рд░реЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╡рд┐рдзрд┐ рд╕рдВрдЦреНрдпрд╛ 4 ред UI рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CoreGraphics рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╡рд┐рдЪрд╛рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рддрддреНрд╡реЛрдВ (рдкрд╛рда рдФрд░ рдЫрд╡рд┐) рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЫрд╡рд┐ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдкрд╛рда рдФрд░ рдПрдХ рддрд╕реНрд╡реАрд░ рджреЛрдиреЛрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╣рдо рдХреБрдЫ рд╕рд░рд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЕрдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди ред рдХреБрдЫ рдФрд░ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рд╡реЗ рд╕реНрдХреНрд░реЙрд▓ рджреГрд╢реНрдп рдФрд░ рдЕрдиреНрдп рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╕реЗрд▓ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SwipeCellKit рдпрд╛ MGSwipeTableCell ред рд▓реЗрдХрд┐рди рдпреЗ рд╕рдорд╛рдзрд╛рди рдорд╛рдирдХ iOS рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рд╡реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрд▓ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ, UITableViewRowAction рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрджрд┐ рдЖрдк рдХрдИ рдХрдХреНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рдИрдВ рдкрд╛рд░реА рдХреЗ рд▓рд┐рдП рдХреНрд░рд┐рдпрд╛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдмреЗрд╣рдж рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕реНрд╡рд╛рдЗрдк рдкрд░ рдЦреБрд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рддрд░реНрдХ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЧрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ, рдЬреИрд╕реЗ рдХрд┐ рд╣рдо UITableViewRowAction рдХреЗ рдорд╛рдирдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдЖрдЗрдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рд╕рд╛рде UITableViewRowAction рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред

UITableViewRowAction рд╕реЗ рд╣рдорд╛рд░реЗ рд╡рдВрд╢рдЬ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдФрд░ рдореБрдЦреНрдп рдЙрджрд╛рд╣рд░рдг рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

 typealias RowActionTapHandler = (RowAction, IndexPath) -> Void class RowAction: UITableViewRowAction { static func rowAction(with actionHandler: @escaping RowActionTapHandler) -> Self { let rowAction = self.init(style: .default, title: nil) { action, indexPath in guard let action = action as? RowAction else { return } actionHandler(action, indexPath) } return rowAction } } 

рдЪреВрдВрдХрд┐ UITableViewRowAction рдореЗрдВ рдкреНрд░рд╛рдердорд┐рдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рд╡рд┐рдзрд┐ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ рд╣рдо рдПрдХ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ UITableViewRowAction рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдХреНрд▓рд┐рдХ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдПрдХ рдПрдХреНрд╢рдирд╣реИрдВрдбрд▓рд░ рдлреЗрдВрдХрддреЗ рд╣реИрдВред

рдЕрдм UITableViewRowAction рдмрдЯрди рдХреЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рдмрдЯрди рдХреЛ рдпреВрдПрд╡реАрд╡рд╛рдИ рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИ (рдЬрд┐рд╕реЗ рдирд┐рдпрдорд┐рдд рдПрдХреНрд╕рд┐рдм рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП рд╣рдо рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ (рдкрд╛рда рдХреЗ рдХрд┐рд╕реА рднреА рдлрд╝реЙрдиреНрдЯ, рдЖрдХрд╛рд░ рдФрд░ рддрддреНрд╡реЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛, рдЖрджрд┐) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдмрдЯрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо UITableViewRowAction рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ: рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд▓рд░ рдФрд░ рд╢реАрд░реНрд╖рдХ ред рдлрд┐рд▓рд╣рд╛рд▓, UITableViewRowAction рдмрдЯрди рдХреЗ рд▓реБрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд▓рд░ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдирд╛ рд╣реИ: UIView -> UIImage -> UIColorред рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: UIColor (patternImage: UIImage) ред рдФрд░ рд╣рдо рдорд╛рдирдХ CoreGraphics рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рдХреЗ UIView рд╕реЗ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╣рдо рдпрд╣ рддрдп рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдмрдЯрди рдХрд╛ рдЖрдХрд╛рд░ рдХреИрд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛рдП: "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ UITableViewRowAction рдореЗрдВ рдЖрдХрд╛рд░ рд╢реАрд░реНрд╖рдХ рдлрд╝реАрд▓реНрдб рдХреЗ рдкрд╛рда рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж (рдмрдЯрди рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреМрдбрд╝рд╛рдИ рдХреЛ рдорд╛рдкрддреЗ рд╣реБрдП), рдореБрдЭреЗ рдПрдХ рдЦрд╛рд▓реА рдпреВрдирд┐рдХреЛрдб рд╡рд░реНрдг рдорд┐рд▓рд╛ рдЬрд┐рд╕рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдиреЙрдирдЬрд░реЛ рдЪреМрдбрд╝рд╛рдИ рд╣реИ: U + 200A

рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдмрдирд╛рдПрдВрдЧреЗ:

 private enum Constants { static let placeholderSymbol = "\u{200A}" } 

рд╣рдо рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ:

 private static let placeholderSymbolWidth: CGFloat = { let flt_max = CGFloat.greatestFiniteMagnitude let maxSize = CGSize(width: flt_max, height: flt_max) let attributes = [NSFontAttributeName : UIFont.systemFont(ofSize: UIFont.systemFontSize)] let boundingRect = Constants.placeholderSymbol.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, attributes: attributes, context: nil) return boundingRect.width }() private func emptyTitle(for size: CGSize) -> String { var usefulWidth = size.width - Constants.minimalActionWidth usefulWidth = usefulWidth < 0 ? 0 : usefulWidth let countOfSymbols = Int(floor(usefulWidth * Constants.shiftFactor / RowAction.placeholderSymbolWidth)) return String(repeating: Constants.placeholderSymbol, count: countOfSymbols) } 

рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░рд╕реНрдореЙрд▓рдмреЙрд╡рд░реНрдб рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рд╣рдорд╛рд░реЗ рдпреВрдирд┐рдХреЛрдб рдЪрд░рд┐рддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рдорд┐рд▓рддреА рд╣реИ, рдФрд░ рд░рд┐рдХреНрдд рд╢реАрд░реНрд╖рдХ (рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП: CGSize) -> рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╡реНрд╣реЙрдЯреНрд╕рдПрдк рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрди рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рд╕реВрддреНрд░ рд╢рд┐рдлреНрдЯрдлреИрдХреНрдЯрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирд╛рдордорд╛рддреНрд░ рдореВрд▓реНрдп рд╕реЗ рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╡рд┐рдЪрд▓рди рдХрд╛ рдЧреБрдгрд╛рдВрдХ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рд╣реА UITableViewRowAction рдХреА рдЪреМрдбрд╝рд╛рдИ рдмрдврд╝рддреА рд╣реИ, рдПрдХ рдЫреЛрдЯреА рд╕реА рддреНрд░реБрдЯрд┐ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ (рдпрд╛рдиреА, рдмрдЯрди рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЪреМрдбрд╝рд╛рдИ рд╕рд╛рдорд╛рдиреНрдп рд╕реВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХреА рдЧрдИ рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИ)ред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рдЗрд╕ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ UITableViewRowAction рдХреА рдиреНрдпреВрдирддрдо рдЪреМрдбрд╝рд╛рдИ 30 рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдиреЗ рд╢реАрд░реНрд╖рдХ = "" рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ)ред рд╢реАрд░реНрд╖рдХ рдХреА рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рдУрд░ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЪреМрдбрд╝рд╛рдИ рдиреНрдпреВрдирддрдо рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╣рдорд╛рд░реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

 private enum Constants { static let placeholderSymbol = "\u{200A}" static let minimalActionWidth: CGFloat = 30 static let shiftFactor: CGFloat = 1.1 } 

рдЕрдм рдЖрдЗрдП UIView рд╕реЗ рдЫрд╡рд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ:

 private func image(from view: UIView) -> UIImage? { UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, UIScreen.main.scale) guard let context = UIGraphicsGetCurrentContext() else { assertionFailure("Something wrong with CoreGraphics image context"); return nil } context.setFillColor(UIColor.white.cgColor) context.fill(CGRect(origin: .zero, size: view.bounds.size)) view.layer.render(in: context) let img = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return img } 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рджреГрд╢реНрдп рдХреЛ рдПрдХ рддрд╕реНрд╡реАрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ рджреГрд╢реНрдп рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рдЪрд░рдг рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЬрд╣рд╛рдВ рд╣рдо UIV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ UITableViewRowAction рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

 func setupForCell(with view: UIView) { guard let img = image(from: view) else { return } self.title = emptyTitle(for: img.size) self.backgroundColor = UIColor(patternImage: img) } 

рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреЗ рдмрдЯрди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╣рдореЗрдВ UITableViewRowAction рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рдФрд░ рдЕрдм рд╣рдо рдЗрд╕реЗ UIVIV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред



IOS 11 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, Apple рдиреЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЗрдк рдПрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рд╛ рд╣реИ - UIContextualActionред рдпрд╣ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЙрд╕ рдЫрд╡рд┐ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рд╛рдЗрдк рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рдПрдЧреА (рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рд╣рдо рдпреВрдЖрдИрдЯреЗрдмрд▓ рд╡реНрдпреВ рд░реЛрд╡рд╛рд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЗрди рд╕рднреА рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдЧрд╛рдпрдм рд╣реИ)ред рд╡рд╣ рд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛, рд▓реЗрдХрд┐рди рдПрдХ рдирдП рдЕрд╡рд╕рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрд╕рдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХреАрдВред рдпрд╣ рд╡рд░реНрдЧ рдЪрд┐рддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддрд╛ рд╣реИ, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд╛рда рдФрд░ рдЪрд┐рддреНрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рд╛рде рд╣реА, рдЪрд┐рддреНрд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╛рд░реВрдк (рдЯреЗрдореНрдкрд▓реЗрдЯ рдЫрд╡рд┐) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ iOS 11 рдореЗрдВ рд╕реНрд╡рд╛рдЗрдк рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдпрд╛ред рдЕрдм UITableViewRowAction рдпрд╛ UIContextualAction рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ RowActionFactory рдлреИрдХреНрдЯреНрд░реА рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг (рдЬреИрд╕реЗ рдХрд┐ рд╣рдордиреЗ рд╕реЗрдЯрдЕрдкрдлреЙрд░рд╕реЗрд▓ (рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде: UIView) рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ ) рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдЗрдХрд╛рдИ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ: UITableViewRowAction рдпрд╛ UIContextualAction ( rowAction () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП (IndexPath рдХреЗ рд▓рд┐рдП: IndexPath) рд╡рд┐рдзрд┐рдпреЛрдВ, рдХреНрд░рдорд╢рдГ)ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд RowActionFactory рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 @available(iOS 11.0, *) func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? { var contextualActions: [UIContextualAction] = [] for actionType in rowActionTypes { // actionType -     let rowActionFactory = RowActionFactory { (indexPath) in tableView.setEditing(false, animated: true) } let rowActionView = <...> //  UIView     rowActionFactory.setupForCell(with: rowActionView) if let contextualAction = rowActionFactory.contextualAction(for: indexPath) { contextualActions.append(contextualAction) } } let swipeActionsConfiguration = UISwipeActionsConfiguration(actions: contextualActions) swipeActionsConfiguration.performsFirstActionWithFullSwipe = false return swipeActionsConfiguration } 

рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: TCSCustomRowActionFactory (github.com) ред

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


All Articles