有没有一种方法可以完全忽略iOS应用程序中的动态类型/字体大小设置? 我的意思是是否有一种像 plist 条目这样的方法,以便我可以完全禁用它。我知道我们可以观察通知并在设置更改时重新配置字体。 我正在寻找一个更简单的解决方案。我正在使用 iOS8。 谢谢。
有没有一种方法可以完全忽略iOS应用程序中的动态类型/字体大小设置? 我的意思是是否有一种像 plist 条目这样的方法,以便我可以完全禁用它。我知道我们可以观察通知并在设置更改时重新配置字体。 我正在寻找一个更简单的解决方案。我正在使用 iOS8。 谢谢。
class MyApplication: UIApplication {
override var preferredContentSizeCategory: UIContentSizeCategory {
get { return UIContentSizeCategory.large }
}
}
UIApplicationMain(
CommandLine.argc,
CommandLine.unsafeArgv,
NSStringFromClass(MyApplication.self),
NSStringFromClass(AppDelegate.self)
)
Objective-C:
@interface MyApplication : UIApplication
@end
@implementation MyApplication
- (UIContentSizeCategory) preferredContentSizeCategory
{
return UIContentSizeCategoryLarge;
}
@end
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, NSStringFromClass([MyApplication class]), NSStringFromClass([AppDelegate class]));
}
}
UIContentSizeCategoryExtraLarge
(比默认值高一个尺寸)在我的iPhone上进行所有开发工作。在设置中没有办法知道默认值或重置为默认值(除非使用新的模拟器)。即使关闭开关,“更大的文本”滑块也始终处于活动状态。当开关打开时,滑块具有更大的范围。 - JeffAppDelegate
中添加以下内容:#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);
...
}
请给@gebirgsbärbel的回答提供Swift 4的修复方法。 在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
}
}
@meaning-matters的答案在Swift中的等效写法如下:
在您的AppDelegate中:
@objc func swizzled_preferredContentSizeCategory() -> UIContentSizeCategory {
return UIContentSizeCategory.small
}
open func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let originalMethod = class_getInstanceMethod(UIApplication.self, #selector(preferredContentSizeCategory))
let swizzledMethod = class_getInstanceMethod(UIApplication.self, #selector(swizzled_preferredContentSizeCategory))
method_exchangeImplementations(originalMethod, swizzled_preferredContentSizeCategory)
}
Use of unresolved identifier 'preferredContentSizeCategory'
。是否还需要其他东西才能使其正常工作? - John Montgomerygetter: UIApplication.preferredContentSizeCategory
和 MyAppDelegate.swizzled_preferredContentSizeCategory
,以及其他一些更改,这样可以清除编译器错误,但在运行时似乎没有任何作用。 - John Montgomery