Синее кольцо подсветки / фокусировки на приложении 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
Другие вопросы по тегам