xcode Catalyst应用程序上的蓝色高亮显示/聚焦环

vhipe2zx  于 2023-01-21  发布在  其他
关注(0)|答案(7)|浏览(125)

我目前正在使用Project Catalyst将我的iOS应用程序移植到macOS。
我的所有文本字段、文本视图和表视图在活动时都有一个蓝色轮廓。
我注意到它在苹果催化剂应用程序(如新闻)在最近的测试,所以我希望这只是一个错误。
有没有人找到别的方法把它取出来?

r8xiu3jd

r8xiu3jd1#

你可以迅速地

extension UITextView {
    #if targetEnvironment(macCatalyst)
    @objc(_focusRingType)
    var focusRingType: UInt {
        return 1 //NSFocusRingTypeNone
    }
    #endif
}
nwnhqdif

nwnhqdif2#

它有助于在Catalyst中禁用所有“视图”类中的聚焦环

extension UIView {
    #if targetEnvironment(macCatalyst)
    @objc(_focusRingType)
    var focusRingType: UInt {
        return 1 //NSFocusRingTypeNone
    }
    #endif
}
tez616oj

tez616oj3#

如果符合您的需要,也可以在Interface Builder中不为特定按钮编写任何代码的情况下完成此操作。
在身份检查器中,只需将用户定义的运行时属性设置为1,如下所示:

4xy9mtcn

4xy9mtcn4#

请不要这样做-这是一个可访问性的焦点指示器,对于只使用键盘的用户很重要。

hpcdzsge

hpcdzsge5#

有一个私有方法_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];

希望我们能从苹果那里得到真实的的解决方案。

nzk0hqpo

nzk0hqpo6#

对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
}
pb3s4cty

pb3s4cty7#

这里提出的解决方案在按tab键会在整个视图周围添加一个蓝色矩形的情况下对我不起作用。我见过这种情况发生在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

相关问题