在 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 中绘制文本然后清除它然后在不同的地方再次绘制的主要内容,如果未能解决你的问题,请参考以下文章