Catalyst 应用程序上的蓝色突出显示/聚焦环

问题描述 投票:0回答:8

我目前正在使用 Project Catalyst 将我的 iOS 应用程序移植到 macOS。

我的所有文本字段、文本视图和表格视图在活动时都有蓝色轮廓。

我在最近的测试版中在 Apple Catalyst 应用程序(例如新闻)中注意到了它,所以我希望这只是一个错误。

有没有人找到其他方法删除它?

swift xcode macos uikit uikitformac
8个回答
21
投票

很快你就可以做到


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


13
投票

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

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

3
投票

如果符合您的需求,也可以在 Interface Builder 中无需针对特定按钮编写任何代码来完成此操作。

在身份检查器中,只需将用户定义的运行时属性设置为 1,如下所示:

enter image description here


1
投票

有一个私有方法

_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];

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


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
}

1
投票

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


0
投票

在按选项卡在整个视图周围添加蓝色矩形的情况下,此处提出的解决方案对我不起作用。我已经看到 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

0
投票

此解决方案不再有效。

我找到了一个不需要使用私有 API 的替代方案。你只需要设置 focusEffect = nil 即可。

示例:

extension UIView {

    func preventSetFocusRingForMac() {
    #if targetEnvironment(macCatalyst)
        focusEffect = nil
    #endif
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.