Синее кольцо подсветки / фокусировки на приложении Catalyst
В настоящее время я работаю над переносом приложения для iOS на macOS с помощью Project Catalyst.
Все мои текстовые поля, текстовые представления и представления таблицы имеют синий контур, когда активны.
Я заметил это в приложениях Apple Catalyst (например, News) в последних бета-версиях, поэтому я надеюсь, что это просто ошибка.
Кто-нибудь нашел способ удалить его иначе?
7 ответов
Вы можете быстро сделать
extension UITextView {
#if targetEnvironment(macCatalyst)
@objc(_focusRingType)
var focusRingType: UInt {
return 1 //NSFocusRingTypeNone
}
#endif
}
Это помогает отключить кольцо фокусировки во всех классах просмотра в Catalyst.
extension UIView {
#if targetEnvironment(macCatalyst)
@objc(_focusRingType)
var focusRingType: UInt {
return 1 //NSFocusRingTypeNone
}
#endif
}
Пожалуйста, не делайте этого — это индикатор фокуса для специальных возможностей, который важен для пользователей, использующих только клавиатуру.
Это также можно сделать без какого-либо кода в Интерфейсном Разработчике для определенных кнопок, если это соответствует вашим потребностям.
В инспекторе удостоверений просто установите для определяемого пользователем атрибута времени выполнения значение 1, например:
Небольшое улучшение ответа Amerino для большей гибкости и использования в раскадровках:
@IBDesignable
class UITextViewCS: UITextView {
@IBInspectable
public var focusRing: UInt = 1 // 0-default, 1-None, 2-Exterior
#if targetEnvironment(macCatalyst)
@objc(_focusRingType)
var focusRingType: UInt {
guard [0, 1, 2].contains(focusRing) else { return 0 }
return focusRing
}
#endif
}
Есть частный метод _setFocusRingType:
который, похоже, соответствует NSView API. Я смог использовать это для удаления кольца фокусировки, хотя это может не пройти проверку приложения.
Используйте это на свой страх и риск:
SEL selector = NSSelectorFromString(@"_setFocusRingType:");
NSMethodSignature *signature = [self.textView methodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setSelector:selector];
NSUInteger arg = 1; // NSFocusRingTypeNone
[invocation setArgument:&arg atIndex:2];
[invocation invokeWithTarget:self.textView];
Надеюсь, мы получим реальное решение от Apple.
Предложенное здесь решение не сработало для меня в ситуациях, когда нажатие на вкладку добавляет синий прямоугольник вокруг всего представления. Я видел, как это происходило для всей страницы UIPageViewController, для ячеек UITableView и многого другого. Единственное решение, которое я смог использовать, чтобы исправить это, - переопределить нажатие клавиши.
#if targetEnvironment(macCatalyst)
open override func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) {
guard let key = presses.first?.key else { return }
switch key.keyCode {
case .keyboardTab: break
default: super.pressesBegan(presses, with: event)
}
}
#endif