ios 在Swift中禁用动态类型

r55awzrz  于 2023-02-26  发布在  iOS
关注(0)|答案(4)|浏览(184)

我有一个基于Sprite Kit的游戏,它在其中一个场景中使用了UIView,我这样做是为了能够利用UITableViewController来呈现游戏设置屏幕。
我遇到的困难是,当用户将iPad系统的辅助功能设置为使用(超)大字体时,UITableView中的文本对于单元格来说太大了,看起来很傻。
我想做的是直接禁用应用程序中的动态类型,这样它总是在单元格中显示相同大小的类型。
我发现了另一个类似的帖子(here),但它提供了一个Objective-C的响应:

#import <objc/runtime.h>

@implementation AppDelegate

NSString* swizzled_preferredContentSizeCategory(id self, SEL _cmd) {
    return UIContentSizeCategoryLarge;  // Set category you prefer, Large being iOS' default.
}

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
    Method method = class_getInstanceMethod([UIApplication class], @selector(preferredContentSizeCategory));
    method_setImplementation(method, (IMP)swizzled_preferredContentSizeCategory);

    ...
}

我需要在斯威夫特做这个。
在Xcode 7+的Swift中做同样的事情的正确方法是什么?

wnvonmuf

wnvonmuf1#

感谢@zeeple提供的解决方案,以下是原问题的答案:
“preferredContentSizeCategory”在Objective-C中是一个方法,但在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
    }
}
nukf8bse

nukf8bse2#

好吧,首先让我说:虽然我很高兴我能够快速找到一种方法来适应iOS辅助功能设置提供的动态文本(我将在一秒钟内显示代码),但我认为获得原始问题的答案仍然很重要。
也就是说,下面是我对表视图代码所做的事情,以考虑一些用户需要的更大类型。这是一个两步的过程。首先,添加:

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

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

cell.textLabel!.numberOfLines = 0

祝大家好运,如果你有问题的话,请在原来的问题上加上答案:)

1cosmwyk

1cosmwyk3#

我想做的是直接禁用应用程序中的动态类型,这样它总是在单元格中显示相同大小的类型。
动态文字仅适用于已实现文本样式的文本。
因此,如果您始终希望禁用动态文字在单元格中显示相同大小的文字,请不要在其中使用文本样式或图像大小调整。
但是,如果确实要使用文本样式,则切勿在Interface Builder * 中为每个文本元素勾选Automatically Adjusts Font(相当于代码中的adjustsFontForContentSizeCategory)*。

u0sqgete

u0sqgete4#

大家好,沮丧的开发者们,
下面是禁用动态类型的完美解决方案:
iOS 15起,您可以设置动态类型的最小和最大大小限制。它适用于UIKit和SwiftUI。

// UIKit

view.minimumContentSizeCategory = .medium
view.maximumContentSizeCategory = .accessibilityExtraLarge

// SwiftUI

ContentView()
  .dynamicTypeSize(.medium ... .accessibility3)

此外,如果您希望直接禁用整个应用程序,则应创建一个基类,它应是所有VC的父类。在BaseVC中,您可以设置代码。

相关问题