0

У меня есть подкласс UIView под названием MENode. Каждый MENode имеет NSMutableDictionary, который отслеживает свои подносы (также MENode). То, что я пытаюсь достичь, - это рисовать линию от родительского узла до дочернего узла. Это моя реализация drawRect: в MENode:Как подключить два UIViews с линией?

- (void)drawRect:(CGRect)rect{ 
//connect the sub node to its super node by drawing a line between the two; 

    for (int i=0; i<self.subNodes.count; i++) { 
     //get one of the child nodes 
     MENode *subNode = [self.subNodes objectAtIndex:i]; 

     //get the context and set up color and line width 
     CGContextRef context = UIGraphicsGetCurrentContext(); 
     CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor); 
     CGContextSetLineWidth(context, 5); 

     //set up a line between the parent node and the child node 
     CGContextMoveToPoint(context, self.center.x, self.center.y); 
     CGContextAddLineToPoint(context, subNode.center.x, subNode.center.y); 

     //draw it. 
     CGContextStrokePath(context); 
    } 
} 

Оба из указанных ниже способов называющихся View Controller. Я называю [self setNeedsDisplay]; в обоих:

-(void)addNode:(MENode *)newNode{ 
    //set the child node's parent node to self (a weak reference) 
    newNode.parentNode = self; 

    //add the node to self.subNodes 
    [self.subNodes addObject:newNode]; 

    //add the node to the parent node 
    [self addSubview:newNode]; 

    //call seeNeedsDisplay 
    [newNode setNeedsDisplay]; 
} 

-(void)nodeAdditionsDone{ 
    //call setNeedsDisplay 
    [self setNeedsDisplay]; 

    //do some logic with this later 
    self.nodeAddtionsAreFinished = YES; 
} 

Когда я запускаю это я не получаю никаких линий, только узлы. Заранее спасибо за вашу помощь.

ответ

1
CGContextMoveToPoint(context, self.center.x, self.center.y); 

self.center находится в представлении в надтаблицы «s координатного пространства, так что может быть частью проблемы. Попробуйте это:

CGContextMoveToPoint(context, CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds)) 

Вы также можете установить точку останова в коде рисования, чтобы гарантировать, что на самом деле имеет self.subNodes объекты во время рисования выполняется.

+0

Спасибо за ваш ответ. Я решил использовать CALayer вместо CGContext для линии из-за преимуществ производительности. Я попытался использовать точки останова для отслеживания 'self.subNodes', но они говорят, что все нуль ... не хороший день для моего компилятора. Я проверил его с NSLog, хотя и работал. – 68cherries