我有一个基于 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);
...
}
我需要在 Swift 中执行此操作。
在 Xcode 7+ 中的 Swift 中执行相同操作的正确方法是什么?
感谢@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
}
}
所有沮丧的开发者大家好,
这是禁用动态类型的完美解决方案:
自 iOS 15 起,您可以设置动态类型的最小和最大尺寸限制。它适用于 UIKit 和 SwiftUI。
// UIKit
view.minimumContentSizeCategory = .medium
view.maximumContentSizeCategory = .accessibilityExtraLarge
// SwiftUI
ContentView()
.dynamicTypeSize(.medium ... .accessibility3)
此外,如果您想直接在整个应用程序中禁用,您应该创建一个基类,它应该是所有 VC 的父级。在BaseVC中你可以设置代码。
好吧,首先让我这么说:虽然我很高兴能够快速找到一种方法来容纳 iOS 辅助功能设置提供的动态文本(我将在一秒钟内展示其代码),但我认为它仍然是得到原始问题的答案很重要。
也就是说,这是我对表视图代码所做的操作,以尊重某些用户需要的更大类型。 这是一个两步过程。 首先添加:
tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension
到 viewDidLoad 方法。 然后,在 cellForRowAtIndexPath 方法中,在返回单元格之前添加以下内容:
cell.textLabel!.numberOfLines = 0
祝大家好运,如果您有问题,请添加原始问题的答案:)
@main
struct YourApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.sizeCategory, .large)
}
}
}
ContentView()
.dynamicTypeSize(.large ... .large)
适用于 iPhone 和 iPad