【问题标题】:drawRect called after creating a custom UI?在创建自定义 UI 后调用 drawRect?
【发布时间】:2012-01-23 17:24:13
【问题描述】:

我需要画两条线。我可以使用相同的 UIView 子类进行两次绘制吗?在我创建 UIView 之后

draw2D *myView = [[draw2D alloc] initWithFrame:myRect];

如果我更改使用变量的方法,我可以更改这些值并调用 drawRect 方法来绘制不同的线吗?

- (void)drawRect:(CGRect)rect
{
    CGContextRef context01 = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context01, 1.0);
    CGContextSetStrokeColorWithColor(context01, [[UIColor blackColor]CGColor]);
    CGContextMoveToPoint(context01, 0, 0);
    CGContextAddLineToPoint(context01, 800, 0);
    CGContextStrokePath(context01);

    CGContextRef context02 = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context02, 1.0);
    CGContextSetStrokeColorWithColor(context02, [[UIColor blackColor]CGColor]);
    CGContextMoveToPoint(context02, 453, 0);
    CGContextAddLineToPoint(context02, 453, 800);
    CGContextStrokePath(context02);
}

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    只需在视图上调用 setNeedsDisplay 即可强制再次调用其 drawRect 方法。

    它不会立即重绘视图,但会将其标记为需要在下一个视图更新周期中再次绘制(更新大约每 60 秒发生一次)。这意味着您可以多次调用 setNeedsDisplay 而不会降低性能。

    【讨论】:

      【解决方案2】:

      我可以使用相同的 UIView 子类来进行两次绘制吗?

      确定

      如果我更改使用变量的方法,我可以更改这些值并调用 drawRect 方法来绘制不同的线吗?

      通常,您只需为这些变量创建一个带有参数的新函数或方法:

      static inline void imp_DrawLine(CGContextRef gtx, CGPoint start, CGPoint end) {
          CGContextMoveToPoint(gtx, start.x, start.y);
          CGContextAddLineToPoint(gtx, end.x, end.y);
          CGContextStrokePath(gtx);
      }
      
      - (void)drawRect:(CGRect)rect
      {
          CGContextRef gtx = UIGraphicsGetCurrentContext();
      
          CGContextSetLineWidth(gtx, 1.0);
          CGContextSetStrokeColorWithColor(gtx, [UIColor blackColor].CGColor);
      
          imp_DrawLine(gtx, CGPointMake(0, 0), CGPointMake(800, 0));
          imp_DrawLine(gtx, CGPointMake(453, 0), CGPointMake(453, 800));
      }
      

      【讨论】:

      • 但是如何让 UIView 重绘?我不相信我可以直接调用 drawRect 方法,可以吗?
      • 您不应直接致电drawRect。相反,使用setNeedsDisplayInRect:setNeedsDisplay 使其无效。然后视图系统会要求您在正确的时间绘制。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2021-05-19
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      相关资源
      最近更新 更多