在 Objective-C 中默认启用自动收缩

Posted

技术标签:

【中文标题】在 Objective-C 中默认启用自动收缩【英文标题】:Enable auto shrink by default in Objective-C 【发布时间】:2015-10-28 13:31:50 【问题描述】:

UILabels 和 UIButtons 是否有可能默认启用自动收缩?

基本上,我需要他们运行这段代码:

self.adjustsFontSizeToFitWidth = YES;
self.minimumScaleFactor = 0.5;

即使它们是从.xib 文件或代码初始化的,也无需用自定义的MyLabel 替换。

【问题讨论】:

这可能是个坏主意。您不想修改系统创建的标签或第三方框架创建的标签,只有您自己拥有。所以自定义子类是要走的路... 嗯,我认为现在的方式是错误的。我有大约 30 种语言的应用程序本地化,确保文本不会在数百种和几种语言中的几种视图中被截断的最简单方法是为所有这些语言启用自动缩小。 那么检查方法 swizzling(和 swizzle UILabel 指定的初始化程序)。但我仍然认为这是一个坏主意...... 好的,我知道这是个坏主意,我会考虑另一种解决方案。但是,为了这个问题,撇开最佳实践不谈,您的 swizzle 答案是完全正确的。您能否发布一个小示例或参考以及建议以避免在现实生活中的应用程序中使用它作为我接受的答案? 【参考方案1】:

虽然我强烈建议不要这样做(如the question comments 中所述),但这里有一种方法可以使用method swizzlingcategory 来实现这一点:

UILabel+SwizzledInitializer.h

//
//  UILabel+SwizzledInitializer.h
//

#import <UIKit/UIKit.h>

@interface UILabel (SwizzledInitializer)

@end

UILabel+SwizzledInitializer.m

//
//  UILabel+SwizzledInitializer.m
//

#import "UILabel+SwizzledInitializer.h"
#import <objc/runtime.h>

@implementation UILabel (SwizzledInitializer)

+ (void)load

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
        Class class = [self class];

        SEL originalSelector = @selector(initWithFrame:);
        SEL swizzledSelector = @selector(initWithFrame_swizzledForAutoShrink:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) 
            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
         else 
            method_exchangeImplementations(originalMethod, swizzledMethod);
        
    );


- (instancetype)initWithFrame_swizzledForAutoShrink:(CGRect)frame;

    self = [self initWithFrame_swizzledForAutoShrink:frame];
    if (self) 
        self.adjustsFontSizeToFitWidth = YES;
        self.minimumScaleFactor = 0.5;
    
    return self;


@end

【讨论】:

很好,我知道 swizzling 但忘了它,虽然我不知道如何实现它。在其他情况下也可能派上用场。 这是我的参考资料:nshipster.com/method-swizzling(你有时间可以阅读整个网站,不过是好东西) [UILabel appearance].adjustsFontSizeToFitWidth = YES; [UILabel appearance].minimumScaleFactor = 0.5; 也不起作用吗? 一般来说,只有带有UI_APPEARANCE_SELECTOR 宏标记的方法或属性才能与外观代理一起使用。但是,有时未标记的属性也可以,因此您应该尝试一下。

以上是关于在 Objective-C 中默认启用自动收缩的主要内容,如果未能解决你的问题,请参考以下文章

php关于ob_start('ob_gzhandler')启用GZIP压缩的bug

自动切换uiviewcontroller Objective-C

在 UITextField 键盘中启用“返回按钮”(objective-c/iphone)

SQL SERVER如何收缩数据库

sqlserver 事务日志已满的几种解决方案

SQL Server数据库的收缩一直在执行