вызов drawRect в подклассе UIView - PullRequest
       1

вызов drawRect в подклассе UIView

0 голосов
/ 23 февраля 2012

Я подклассифицировал UIView и у меня реализован drawRect.Я в основном хочу, чтобы этот drawRect вызывался после того, как я установил CGPoint, который является свойством этого UIView.Как мне это сделать?Вот мой код:

-(id) initWithCoder:(NSCoder *)aDecoder
{
    if(self = [super initWithCoder:aDecoder]) {
        point_.x = 0;
        self.page_ = [UIImage imageNamed:@"pages"];
    }
    return self;
}

// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    if (point_.x != 0){
        [self.page_ drawInRect:rect];
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
        CGContextSetLineWidth(context, 1.0f);
        CGContextMoveToPoint(context, 40, point_.y); 
        CGContextAddLineToPoint(context, 420, point_.y);
        CGContextStrokePath(context);
    }
}

Когда я установил точку этого UIView и я вызываю drawRect в моем другом UIViewController, как показано ниже:

 self.page_.point_ = CGPointMake(-100, self.title_.frameHeight + self.title_.frameX + 40);
    [self.page_ drawRect:self.page_.frame];

Это дает мне все эти ошибки:

  <Error>: CGContextSaveGState: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextSetBlendMode: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextSetAlpha: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextTranslateCTM: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextScaleCTM: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextDrawImage: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextRestoreGState: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextSetStrokeColorWithColor: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextSetLineWidth: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextMoveToPoint: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextAddLineToPoint: invalid context 0x0
    Feb 22 20:24:38 <Error>: CGContextDrawPath: invalid context 0x0

Почему это?

Ответы [ 3 ]

4 голосов
/ 23 февраля 2012

Никогда не звоните -drawRect: напрямую.

Используйте вместо этого -setNeedsDisplay:

self.page_.point_ = CGPointMake(-100, self.title_.frameHeight + self.title_.frameX + 40);
[self.page_ setNeedsDisplay];

Если вам нужночтобы настроить область рисования (то есть CGRect, которая будет передана -drawRect:), вы можете использовать -setNeedsDisplayInRect:

. Как подсказал @ rob mayoff , вы можете переопределитьсеттер для свойства point_:

- (void)setPoint_:(CGPoint)point {
   if(!CGPointEqualToPoint(point_, point)) {
      point_ = point;
      [self setNeedsDisplay];
   }
}
2 голосов
/ 17 января 2013
- (id)initWithCoder:(NSCoder *)aDecoder // (1)
{
if (self = [super initWithCoder:aDecoder])
{
    [self setMultipleTouchEnabled:NO]; // (2)
    [self setBackgroundColor:[UIColor whiteColor]];
    path = [UIBezierPath bezierPath];
    [path setLineWidth:2.0]; 
}
return self;
}


- (void) drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBStrokeColor(context, 0.0, 0.0, 0.0, 1.0);
CGContextSetLineWidth(context, 3.0);
CGContextDrawPath(context, kCGPathFillStroke);    //CGContextSetRGBFillColor doesn't work either
CGContextBeginPath(context);
CGContextMoveToPoint(context, 100.0, 60.0);
CGRect rectangle = {100.0, 60.0, 120.0, 120.0};
CGContextAddRect(context, rectangle);

CGContextStrokePath(context);
CGContextFillPath(context);
}
this code implement in create new uiview and add this code i hope that code you usefull.
0 голосов
/ 09 августа 2012

Оберните код вашего чертежа в UIGraphicsPushContext( context ) и UIGraphicsPopContext(), чтобы избежать появления этих сообщений об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...