Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITextView图形文本两次_Ios_Uitextview - Fatal编程技术网

Ios UITextView图形文本两次

Ios UITextView图形文本两次,ios,uitextview,Ios,Uitextview,我正在尝试在UITextViews文本上创建笔划文本。它工作正常,但文本在屏幕上绘制了两次。这是我在UITextView子类中的drawRect方法 - (void)drawRect:(CGRect)rect { // Drawing code // Drawing code UIFont *font = [UIFont fontWithName:@"Cochin" size:[_fontSize floatValue]]; CGContextRef cont

我正在尝试在UITextViews文本上创建笔划文本。它工作正常,但文本在屏幕上绘制了两次。这是我在UITextView子类中的drawRect方法

- (void)drawRect:(CGRect)rect
{
    // Drawing code
    // Drawing code

    UIFont *font = [UIFont fontWithName:@"Cochin" size:[_fontSize floatValue]];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetShadow(context, CGSizeMake(1, 1), 1);
    CGContextSetRGBFillColor(context,1,1,1, 1);
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 1);
    CGContextSetLineWidth(context, .35);
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSaveGState(context);
    [[self text] drawInRect:rect withFont:font];
}

我尝试将ClearContextOnDraw设置为“是”,但没有成功。请帮忙…

我刚刚尝试了你的代码,它确实对我有用。不过有几个注意事项:

  • 您应该使用
    self.bounds
    作为要绘制的目标rect,而不是您得到的
    rect
    参数,因为它表示“这是视图的无效区域”。这是一种性能优化,您很少需要使用它

  • 您不需要调用
    CGContextSaveGState
    (这样做之后,您将需要恢复它)。您通常会在调用实际修改当前上下文(并随后恢复)的子例程时执行此操作,但理想情况下,应该将其移动到例程本身

  • 尝试将视图的背景设置为白色,并使字体变大,您可能会得到正在发生的事情的提示。另外,你可以在这里发布一个截图

    更新:

    我没有注意到您正在使用
    UITextView
    。您不应该使用此类进行自定义绘图!如果您想自己绘制文本,请使用子类
    UIView
    。如果要使用
    UITextView
    ,请使用
    UITextView
    attributedString
    属性(例如,在
    UIViewController
    子类中设置它)。
    以下是有关属性字符串的更多信息:

    您不应该直接调用drawRect

    而不是:

    [[self text] drawInRect:rect withFont:font];
    
    尝试:


    哦,天哪,文本系统是一个复杂的野兽,有很多很多(大部分是私有的)类、方法和数据结构

    您有NSTextStorage、NSLayoutManager、NSTextContainer和UITextView作为公共类。为了更好地度量,请加入UITextRange和UITextPosition。在Mac OS X上,您也有排版器类

    虽然UITextView要求NSLayoutManager在某些rect区域中绘制文本(通过专用方法而不是drawRect),但绘制本身实际上是由NSLayoutManager完成的。如果您想自己绘制文本,则必须提供自己的NSLayoutManager子类


    使用NSLayoutManager子类作为最后手段。可以使用自定义uiview自己绘制框架和文本,也可以使用uitextview尝试找出系统绘制文本的方式。您需要使用NSLayoutManager方法。绘制框架,而不是uitextview类的drawRect中的文本。

    我使用此方法来避免此问题登月舱

    - (void)drawRect:(CGRect)rect{
    
        //YOUR Drawing code here ...
    
        self.textColor = [UIColor clearColor];
    }
    

    请注意,他不是直接调用
    UIView
    的方法
    drawRect
    ,而是调用
    NSString
    drawInRect
    ,这是不同的,完全没有问题。这不起作用。它仍然会绘制两次文本视图。第一次在drawRect中执行自定义绘图代码。除此之外,它还会从文本中绘制文本tview及其默认值。我将颜色设置为“clear color”并解决了此问题,但这似乎是一个黑客作业。我的问题是如何使drawRect停止uitextview的默认渲染?这是我问题的图像。背景中的暗层是drawRect自定义图形。前面的黑色层是ui的标准图形你找到解决方案了吗?我也遇到了同样的问题
    - (void)drawRect:(CGRect)rect{
    
        //YOUR Drawing code here ...
    
        self.textColor = [UIColor clearColor];
    }