2015-06-04 3 views
0

Я новичок в разработке IOS и в настоящее время имею приложение с кнопкой, которая создает новые экземпляры перетаскиваемого класса UIView, который я создал. Я хочу сделать так, что есть UIBezierPaths, соединяющие каждый экземпляр UIView. Я хочу, чтобы связанные строки UIBezierPath следуют, когда я перетаскиваю экземпляры UIView на экране. Как/Где я могу поместить код UIBezierPath чертежа, чтобы получить этот эффект?UIBezierPath между перетаскиваемыми видами

ответ

2

Я сделал проект некоторое время назад, что делает что-то похожее на то, что вы хотите. Код для рисования строк в drawRect:, и я использую наблюдателя свойств для перерисовки строк при перетаскивании представления. Это приложение помещает 10 кругов (экземпляры NodeView) в случайные позиции на экране и добавляет строки от одного к другому. Вот код, который находится в пользовательском классе UIView, который я использую в качестве self.view контроллера,

@implementation RDView 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     _nodes = [NSMutableArray new]; 
     for (int i = 0; i<10; i++) { 
      NodeView *aNode = [NodeView new]; 
      CGFloat hue = arc4random_uniform(1000)/1000.0; 
      aNode.backgroundColor = [UIColor colorWithHue:hue saturation:1 brightness:1 alpha:.7]; 
      CGFloat xVal = arc4random_uniform(300); 
      CGFloat yVal = arc4random_uniform(400) + 50; 
      aNode.frame = CGRectMake(xVal, yVal, 20, 20); 
      [self addSubview:aNode]; 
      UIPanGestureRecognizer *panner = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
      [aNode addGestureRecognizer:panner]; 
      [_nodes addObject:aNode]; 
     } 
    } 
    return self; 
} 


-(void)awakeFromNib { 
    for (NodeView *aNode in self.nodes) { 
     [aNode addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew context:nil]; 
    } 
} 


-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"center"]) [self setNeedsDisplay]; 
} 


- (void)drawRect:(CGRect)rect { 
    UIBezierPath *path = [UIBezierPath bezierPath]; 
    [path moveToPoint:[self.nodes[0] center]]; 
    for (int i = 1; i<self.nodes.count; i++) { 
     CGFloat dashes[] = {0, path.lineWidth * 2}; 

     [path setLineDash:dashes count:2 phase:0]; 
     path.lineCapStyle = kCGLineCapRound; 
     [path addLineToPoint:[self.nodes[i] center]]; 
    } 
    [path closePath]; 
    [path stroke]; 
} 




- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:self]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x, recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self]; 
} 

Вы можете найти проект здесь, http://jmp.sh/68SdS4f

+0

Это именно то, что я пытался реализовать. Огромное спасибо. – Girthworm

Смежные вопросы