在 UIView 中绘制文本然后清除它然后在不同的地方再次绘制

Posted

技术标签:

【中文标题】在 UIView 中绘制文本然后清除它然后在不同的地方再次绘制【英文标题】:Draw text in UIView then clear it then draw again in a different place 【发布时间】:2014-04-17 15:31:07 【问题描述】:

我正在尝试在 UIView 中绘制文本,“擦除”它,然后在不同的位置再次绘制它。 (或者改为绘制不同的文本)

我有一个单页应用程序、Storyboard、Xcode 5、ios 7。 我为 UIView 创建了一个子类,并且可以使用“drawRect”方法一次绘制一个字符串。 但是,这只会被调用一次,所以它没有用。

我在我的子类中创建了另一个方法,但调用它似乎不起作用。

如何创建一个可以重复调用来绘制文本的方法?

这是我的代码: 我的视图.h

#import <UIKit/UIKit.h>

@interface MyView : UIView

-(void)drawIt:(NSString *)inText;
@end

MyView.m

#import "MyView.h"

@implementation MyView

- (id)initWithFrame:(CGRect)frame
    self = [super initWithFrame:frame];
    if (self) 
        // Initialization code
    
    return self;


// This executes once and works
-(void)drawRect:(CGRect)myRect
    UIFont *myFont=[UIFont fontWithName:@"Helvetica" size:30];
    NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    paragraphStyle.alignment = NSTextAlignmentLeft;

    NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
    [attributes setObject:myFont forKey:NSFontAttributeName];
    [attributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName];
    [attributes setObject:[UIColor blackColor] forKey:NSForegroundColorAttributeName];
    [@"TEST"  drawInRect:myRect withAttributes:attributes];


//This is what I'd like to call repeatedly with different text or clear, etc...
//However nothing shows when I call it
-(void)drawIt:(NSString *)inText
    CGRect myRect=CGRectMake(0,0,self.bounds.size.width,self.bounds.size.height);
    UIFont *myFont=[UIFont fontWithName:@"Helvetica" size:30];

    NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    paragraphStyle.alignment = NSTextAlignmentRight;

    NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
    [attributes setObject:myFont forKey:NSFontAttributeName];
    [attributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName];
    [attributes setObject:[UIColor blackColor] forKey:NSForegroundColorAttributeName];
    [inText drawInRect:myRect withAttributes:attributes];

@end

在我的 ViewController.m 中:

#import "TextDrawViewController.h"
#import "MyView.h"

@interface TextDrawViewController ()

@end

@implementation TextDrawViewController

- (void)viewDidLoad
    [super viewDidLoad];

    MyView *xView = [[MyView alloc] init];

    [xView drawIt:@"junk"];

@end

【问题讨论】:

【参考方案1】:

最好将所有绘图代码放到-(void)drawRect:(CGRect)myRect方法中。 更新文字和位置后调用[self setNeedsDisplay];,iOS会自动调用drawRect:方法。

【讨论】:

这让我想到两个问题:1) 为什么这样更好? 2)如何使“drawIt”上面的替代方法起作用? @wayneh 你不能在任何时候随心所欲地画任何东西。 iOS 在调用 drawRect 方法时自行决定。您只能通过调用 setNeedsDisplay 方法要求它重绘视图。 iOS 执行的正是绘图优化。 here 有更多解释。关于您的任务:您可以将所有变化的数据(文本、位置等)存储到实例变量中,在 drawRect 方法中将其用于绘图,并在一个或多个变量发生变化时调用 setNeedsDisplay 方法。希望对你有所帮助。 你是说我自己的方法不能画Text?这似乎不太可能 - 谁能开发绘图程序? @wayneh,正如 Visput 所说,他们通过将绘图代码放入 drawRect 中来开发绘图程序。这并不意味着所有事情都必须在那里完成 - 例如,您可以在 draw rect 之外创建一大堆贝塞尔路径,但是您需要在 drawRect 中描边或填充它们(即实际进行绘图)。 Visput 在他的评论中概述的方法是要走的路。 @wayneh 实际上你可以将 drawIt 方法的调用移动到 drawRect 方法的实现中,并使用 setNeedsDisplay 来启动视图重绘。

以上是关于在 UIView 中绘制文本然后清除它然后在不同的地方再次绘制的主要内容,如果未能解决你的问题,请参考以下文章

kCGBlendModeClear 不清除,为啥?

如何在Android中绘制弯曲文本

从 UIImage 清除 UIView 绘图

UIView 的快照视图在上下文中渲染/绘制,没有任何内容

如何清除 Tkinter 画布?

更新 UIView 子类中 drawRect 中绘制的组件中的文本