iOS 模糊文本:一劳永逸地检测和解决它?

Posted

技术标签:

【中文标题】iOS 模糊文本:一劳永逸地检测和解决它?【英文标题】:iOS blurred text: detecting & solving it once and for all? 【发布时间】:2011-01-09 03:17:57 【问题描述】:

我不止一次遇到过 UIView(子类)以小数偏移结束的情况,例如因为它的尺寸是奇数并且居中,或者因为它的位置基于奇数大小的容器的中心。

这会导致文本(或图像)模糊,因为 ios 会尝试在半像素偏移上渲染视图(和子视图)。我觉得每次换帧都调用CGRectIntegral() 并不是一个完美的解决方案。

我正在寻找轻松检测这些情况的最佳方法。在写这个问题时,我想出了一个相当激进的方法,它在我当前的项目中发现了比我想象的更多的偏差。

所以这是为了分享。我们非常欢迎对更好或更不激进的替代方案提出意见和建议。

main.m

#import <objc/runtime.h>
#import "UIViewOverride.h"

int main(int argc, char *argv[]) 

#ifdef DEBUGVIEW
    Method m1,m2;
    IMP imp;
    m1 = class_getInstanceMethod([UIView class], @selector(setFrame:));
    m2 = class_getInstanceMethod([UIViewOverride class], @selector(setFrameOverride:));
    imp = method_getImplementation(m2);
    class_addMethod([UIView class], @selector(setFrameOverride:), imp, method_getTypeEncoding(m1));
    m2 = class_getInstanceMethod([UIView class], @selector(setFrameOverride:));
    method_exchangeImplementations(m1,m2);

    m1 = class_getInstanceMethod([UIView class], @selector(setCenter:));
    m2 = class_getInstanceMethod([UIViewOverride class], @selector(setCenterOverride:));
    imp = method_getImplementation(m2);
    class_addMethod([UIView class], @selector(setCenterOverride:), imp, method_getTypeEncoding(m1));
    m2 = class_getInstanceMethod([UIView class], @selector(setCenterOverride:));
    method_exchangeImplementations(m1,m2);
#endif

// etc

UIViewOverride.m

这是作为 UIView 子类实现的,可避免强制转换和/或编译器警告。

#define FRACTIONAL(f) (fabs(f)-floor(fabs(f))>0.01)

@implementation UIViewOverride

#ifdef DEBUGVIEW
-(void)setFrameOverride:(CGRect)newframe

    if ( FRACTIONAL(newframe.origin.x) || FRACTIONAL(newframe.origin.y) )
    
        [self setBackgroundColor:[UIColor redColor]];
        [self setAlpha:0.2];
        NSLog(@"fractional offset for %@",self);
    
    [self setFrameOverride:newframe]; // not a typo


-(void)setCenterOverride:(CGPoint)center

    [self setCenterOverride:center]; // not a typo
    if ( FRACTIONAL(self.frame.origin.x) || FRACTIONAL(self.frame.origin.y) )
    
        [self setBackgroundColor:[UIColor greenColor]];
        [self setAlpha:0.2];
        NSLog(@"fractional via center for %@",self);
    

#endif

有问题的视图会生成日志消息并显示为透明的红色或绿色。

-DDEBUGVIEW 在调试模式下设置为编译器标志。

【问题讨论】:

【参考方案1】:

您可以通过 CoreAnimation 工具及其未对齐标志获得相同的功能。

【讨论】:

酷。以前从未听说过,但绝对比我做的要容易!

以上是关于iOS 模糊文本:一劳永逸地检测和解决它?的主要内容,如果未能解决你的问题,请参考以下文章

论文泛读163用于推文中情绪检测的模糊粗略最近邻方法

论文泛读163用于推文中情绪检测的模糊粗略最近邻方法

一劳永逸解决pip install慢的方法

一劳永逸解决pip install慢的方法

一劳永逸解决uniapp uparse 图片越界的问题

来自身份证明文件检测和 ocr 的模糊文本