UITableView додаємо іконку до UITableViewRowAction

iOS SDK дає нам з коробки два варіанти налаштувати кнопку, яка буде показана при зрушенні UITableViewCell вліво.

uitableviewrowaction

Перший варіант, доступний з перших версій і до наших днів, мало привабливий для звичайних кнопок, оскільки призначений саме для «небезпечних» дій, тому що фон забарвлюється системою в червоний колір і не піддається легкій зміні через публічний API.

Другий варіант, доступний з iOS 8, більше приваблює, оскільки є можливість вказати стиль кнопки (Destructive, Normal), а також у разі потреби встановити конкретний колір фону черезbackgroundColor.

Ні перший, ні другий варіанти не дозволяють призначити іконку, що досить неприємно. Але ми все одно спробуємо щось зробити.Спроба раз

UITableViewRowAction виглядає більш багатим на налаштування. Спробуємо поставити йомуbackgroundColorза допомогоюpatternImage:

кнопки

Результат очікувано кривуватий, але ми хоча б отримали іконку на кнопці. Залишимо питання кольору фону та тексту на потім, спершу спробуємо налаштувати саму іконку.

ОскількиpatternImageпокликаний повторюватися, спробуємо збільшити сам pattern, щоб він повторювався якнайменше — створимо pattern за розміром кнопки:

іконку

Тепер виглядає набагато краще. Але якщо, наприклад, поле виявиться багаторядковим, а слідом за висотою розтягнеться і комірка, то буде не дуже приємно:

uitableviewrowaction

Спробуємо зробити інакше. Що відбувається, коли ми зрушуємо рядок вліво? Правильно, вона просто їде ліворуч, оголюючи те, що знаходиться нижче за ієрархією: кнопку. Спробуємо додати шар зверху, який буде пристебнутий до правого краю комірки (компонент PureLayout на допомогу для швидкості реалізації).

кнопки

Тепер результат набагато приємніший, правда є однеалев даному підході: ширина зсуву комірки визначається текстом в UITableViewRowAction.title. Відповідно, доведеться регулювати видиму частину кнопки саме цим параметром. Як варіант - заповнювати його відповідними потрібними ширинами пробілами, або дописувати щось на початок або кінець.

До речі, цей елемент не відпрацьовує натискання сам, тому вони спокійно пересилаються наUITableViewRowAction.handler.

uitableviewrowaction

Схоже, тепер все виглядає чудово.

У результаті є дваалепри такому підході: — ширина зсуву визначається окремо параметром UITableViewRowAction.title — не вдасться зробити більше однієї кнопки, або доведеться тіснити їх у своєму шарі і туди ж вставляти свої кнопки

Однак це бачиться мені приємніше, ніж поширений підхід щодо вбудовування кнопки в саму комірку з обробкою жестів, оскільки ускладнюється логіка.

Можливо, є ще лаконічніший спосіб досягти бажаного, але мені про таке поки що невідомо.

Ви можете допомогти і перевести небагато коштів на розвиток сайту