【问题标题】:Can UILabel's drawTextInRect method be overridden to change the size of UILabel's text?是否可以重写 UILabel 的 drawTextInRect 方法来改变 UILabel 的文本大小?
【发布时间】:2009-07-10 08:45:30
【问题描述】:

Apple 的 drawTextInRect 文档似乎表明这是可能的:

"调用此方法时,当前图形上下文已经配置了绘图的默认环境和文本颜色。在您覆盖的方法中,您可以进一步配置当前上下文,然后调用 super 进行实际绘图或者你可以自己绘制。如果你自己渲染文本,你不应该调用 super。

但是我的 UILabel 子类中的下面示例(我已经确认 is 被调用)不会导致文本大小发生变化,无论我指定什么文本大小。我是否抓住了正确的背景,或者可能错过了更大的东西?

- (void)drawTextInRect:(CGRect)rect{

    CGContextRef theContext = UIGraphicsGetCurrentContext();
    CGContextSetFontSize(theContext, 32.0); // <-- doesn't change text size

    [super drawTextInRect:rect];
}

注意 - 文本大小不是我需要更改的唯一文本大小,但如果我可以更改文本大小,我很确定我需要进行的其余更改会很容易。

【问题讨论】:

    标签: objective-c iphone cocoa-touch core-graphics


    【解决方案1】:
    /* use CGContextSetLineWidth() and CGContextSetStrokeColorWithColor() 
     to adjust your outline settings: directly preceding StrokeRect() */
    
    
    - (void)drawTextInRect:(CGRect)rect{
    
        [super drawTextInRect:rect]; // let super do the work
    
        CGContextStrokeRect(UIGraphicsGetCurrentContext(),rect);
    }
    

    【讨论】:

    • 刚试了一下,它在整个 UILabel 周围画了一个轮廓,而不是在文本字母周围。不过谢谢!说真的,你们太棒了。
    【解决方案2】:

    我以为我们昨天有这个....
    您可以相信 appKit 超类会将字体和颜色等设置为您在 InterfaceBuilder 中设置的设置,因此尝试覆盖此行为完全是徒劳的。你可以做的是按摩进入绘图功能的参数以改变功能......尝试这样的事情:

    - (void)drawTextInRect:(CGRect)rect{
    
        CGFloat newWidth = rect.size.width * 0.75;    // 3/4 the original width
        CGFloat newHeight = rect.size.height * 0.812; // and a little less tall.
    
        CGRect newRect = CGRectMake(rect.origin.x,rect.origin.y,newWidth,newHeight);
    
        [super drawTextInRect:newRect]; // draw text into the NEW rect!
    }
    

    另外,nikolai 是正确的:如果要更改字体,请调用 setFont!

    【讨论】:

    • 是的,你昨天的建议似乎是最好的途径——这实际上就是我现在询问 drawTextInRect 的原因。我只询问了字体大小,因为我试图简化这个例子——我想如果我可以改变字体的大小,我也可以改变它的填充和描边以及我需要的大纲文本的颜色。虽然您在上面发布的 sn-p 有所帮助,但在了解如何使 drawTextInRect 向我的 UILabel 子类文本添加轮廓时,我仍然接近第一。但我真的很感谢到目前为止的帮助!!!
    【解决方案3】:

    你可以尝试设置UILabel的字体:

    UIFont *font = [UIFont fontWithName:@"Courier" size:32];
    [self setFont: font]; 
    [super drawTextInRect:rect];
    

    【讨论】:

      【解决方案4】:

      我认为对 [super drawTextInRect:rect] 的调用也会设置字体大小,从而撤消对 CGContextSetFontSize 的调用。如果你想要这个,你可能不得不自己完成所有的绘图,而不是调用 super 的实现。

      【讨论】:

        【解决方案5】:

        UILabel 的 drawTextInRect 方法设置文本大小(连同字体和其他设置)本身,覆盖您的大小。如果你想改变字体大小,为什么不直接使用 setFont: 方法或者 minimumFontSize 属性呢?

        【讨论】:

        【解决方案6】:

        您不能在委托方法中执行此操作。您需要获取指向 UILabel 的指针 (IBOutlet)。

        然后您可以使用 UILabel 的 setText: 方法设置 UILabel 的字体、粗体等

        【讨论】:

        • 我认为我在问题中包含的 Apple 文档中的引用可能使我误入歧途。说“您可以进一步配置当前上下文”的部分让我认为我可以将我的一个像素边框添加到 UILabel 从 drawTextInRect 委托中显示的各个字母。好像不是这样的?我希望有 setTextOutlineColorsetTextOutlineWidth 方法 - 那太好了!!!
        • 再次,我只是使用 CGContextSetFontSize 作为一个简单的例子,我认为人们必须在 drawTextInRect 中使用它。我想如果可以这样做,那么我也可以轻松更改文本大纲的内容。
        猜你喜欢
        • 1970-01-01
        • 2014-10-07
        • 1970-01-01
        • 2011-06-19
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多