UIBandSelectionInteraction vs. колір фону UICollectionViewCell
Один з моїх колег (kudos, Nik) додав підтримку вказівника на iPad OS під час наших Ship It днів (приблизно раз на місяць ми можемо робити будь-яку фічу/покращення, яке хочемо). Через деякий час команда долучилась і ми всі готували це до релізу.
Коли дійшло до QA, ми отримали дивний тікет: перегляд списку файлів в режимі Select іноді скасовує виділення всіх раніше вибраних елементів. Я занурився в цей тікет. Причина була очевидною з першого погляду – band selection (UIBandSelectionInteraction) спрацьовував 1x1 виділенням на натиснутій комірці, яка робила те, що повинна була робити – очищала попереднє виділення і виділяла комірки (ту єдину), які перетиналися з selectionRect.
Баг було непросто відтворити. Іноді я міг вибрати близько 10 файлів, іноді лише два.
Моя перша ідея була… закотити очі і сказати,– “О, цей Apple…”. Я досліджував це деякий час і не знайшов способу запобігти UIBandSelectionInteraction від такої поведінки. Тож не залишалось нічого іншого, як реалізувати власний UIBandSelectionInteraction. Я подивився на Files.app і почав складати список вимог:
- базове виділення
- shift + виділення
- cmd + виділення
- автопрокрутка
- список продовжувався
- і продовжувався…
День закінчився, і разом з ним мої когнітивні здібності.
Вранці я вирішив уважніше придивитись до оточення в асемблері. Через деякий час я виявив, що band selection перевіряє чи є UIContol підклас у стартовій точці.
Я вирішив видалити всі UIContols з комірки. І ура! баг став 100% відтворюваним!
Я перевірив Files app знову – у них не було такого бага. Я перевірив інший collection view у нашому додатку – також немає такого бага. Але що за… ?
Завжди краще працює, коли відходиш від столу на якийсь час. Під час прогулянки мені прийшла нова ідея. А що якщо це має відношення до кольору фону нашої комірки? Я пофарбував її в зелений – немає бага, повернув наш колір – баг є. А-га! Але що такого особливого в нашому кольорі? У режимі Select ми маємо напівпрозору сіру рамку навколо кожного файлу, який можна вибрати. Він заповнений нашим кольором gray5 – сірим з 6 :) відсотками альфи. Я пограв з цим кольором і з’ясував, що як тільки альфа < 10 % UIBandSelection думає, що в’юха… прозора! Але вона далеко від прозорого для людського ока!
У мене була теорія, що можливо я зміг би обдурити UIKit не строго сірим кольором з такою ж альфою, яка нам потрібна, я маю на увазі, додати 1 до будь-якого компоненту в нашому 0x161616. Ні, це не спрацювало. Синій з альфою 5 також вважається прозорим.
Гаразд, тепер у мене були всі шматочки пазлу. У мене було два варіанти для фікса:
- запитати наших дизайнерів чи нам справді потрібен цей колір 0.6 – чи не підійшло б нам 10. Виглядало потворно, але я спробував :)
- змішати колір фону комірки з фоном collection view і використовувати цей непрозорий колір як bg
Ви вже знаєте відповідь. Тепер колір виділення нашого списку файлів непрозорий, і у нас є довгий зелений коментар який пояснює чому так.