在Swift中禁用动态类型

时间:2016-08-02 03:23:03

标签: ios swift uitableview accessibility

我有一个基于Sprite Kit的游戏,在其中一个场景中使用UIView,我这样做是为了让我可以利用UITableViewController来呈现游戏设置屏幕。 我遇到的困难是当用户将他们的iPad系统辅助功能设置设置为使用(额外)大型时,UITableView中的文本对于单元格而言太大而且看起来很愚蠢。 我想要做的是直接禁用应用程序中的动态类型,以便它始终在单元格中显示相同大小的类型。 我找到了另一个类似的帖子(这里),但响应提供了Objective-C响应: #import< objc / runtime.h> @implementation AppDelegate NSString * swizzled_preferredContentSizeCategory(id self,SEL _cmd){     return UIContentSizeCategoryLarge; //设置您喜欢的类别,大型是iOS'默认。 } - (BOOL)应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     Method method = class_getInstanceMethod([UIApplication class],@ selector(preferredContentSizeCategory));     method_setImplementation(方法,(IMP)swizzled_preferredContentSizeCategory);     ... } 我需要在Swift中这样做。 在Xcode 7+中使用Swift做同样事情的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

好的,首先让我这样说:虽然我很高兴能够快速找到一种方法来容纳iOS辅助功能设置提供的动态文本(我将在一秒内显示代码)我认为它得到原始问题的答案仍然很重要。

也就是说,这是我对表视图代码所做的,以尊重某些用户需要的更大类型。这是一个两步的过程。首先,添加:

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

到viewDidLoad方法。然后,在cellForRowAtIndexPath方法中,在返回单元格之前添加以下内容:

cell.textLabel!.numberOfLines = 0

祝你好运,如果您有原始问题请加上答案:)

答案 1 :(得分:1)

动态类型仅适用于已实现text styles的文本。

因此,如果您始终要禁用动态类型在单元格中显示相同大小的类型,请不要使用文本样式,也不要使用image size adjustment他们。

但是,如果您确实要使用文本样式,请不要在Interface Builder中为每个文本元素打勾Automatically Adjusts Font(相当于代码中的adjustsFontForContentSizeCategory)。

答案 2 :(得分:0)

感谢@zeeple提供解决方案。 这是原始问题的答案:

Objective-C中的“ preferredContentSizeCategory”是一种方法,但是在Swift中,它是一个只读变量。

所以在您的AppDelegate中是这样的:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    // MARK: - UIApplicationDelegate

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {

        UIApplication.classInit

        self.window = UIWindow(frame: UIScreen.main.bounds)
        ...
        self.window?.makeKeyAndVisible()
        return true
    }
}

// MARK: - Fix Dynamic Type

extension UIApplication {

    static let classInit: Void = {
        method_exchangeImplementations(
            class_getInstanceMethod(UIApplication.self, #selector(getter: fixedPreferredContentSizeCategory))!,
            class_getInstanceMethod(UIApplication.self, #selector(getter: preferredContentSizeCategory))!
        )
    }()

    @objc
    var fixedPreferredContentSizeCategory: UIContentSizeCategory {
        return .large
    }
}