2014-05-19 7 views
2

노드 (UIViews)를 드래그 할 수있는 "scrollview"가 있습니다. 나는 "calayer"와 함께 UIViews을 선택한 사이에 모서리를 그리려고하지만 뷰 위치가 변경되면 선을 다시 그리는 방법을 알 수 없습니다.두 개의 이동 가능한 uiviews 사이에 선 그리기

EdgeLayer *edge = [[EdgeLayer alloc]init]; 
edge.delegate = self; 
edge.strokeColor = [UIColor colorWithWhite:0.25 alpha:1.0]; 
edge.strokeWidth = 0.5; 
edge.startNode = [nodes objectAtIndex:0]; 
edge.endNode = [nodes objectAtIndex:1]; 
edge.frame = scrollView.bounds; 
[scrollView.layer addSublayer:edge]; 
[edge setNeedsDisplay]; 

EdgeLayer.h : 내 viewController 클래스에서

나는대로 노드 배열에 제 1 및 제 2 사이의 테두리를 추가

#import <Foundation/Foundation.h> 
#import <QuartzCore/QuartzCore.h> 

@interface EdgeLayer : CALayer 
@property (nonatomic, strong) UIColor *fillColor; 
@property (nonatomic) CGFloat strokeWidth; 
@property (nonatomic, strong) UIColor *strokeColor; 
@property (nonatomic) UIView *startNode; 
@property (nonatomic) UIView *endNode; 
@end 

EdgeLayer.m :

#import "EdgeLayer.h" 
#import "NodeView.h" 

@implementation EdgeLayer 

@synthesize fillColor, strokeColor, strokeWidth; 
- (id)init { 
    self = [super init]; 
    if (self) { 
    self.fillColor = [UIColor grayColor]; 
    self.strokeColor = [UIColor blackColor]; 
    self.strokeWidth = 1.0; 
    [self setNeedsDisplay]; 
} 

return self; 
} 

- (void) setStartNode:(NodeView*)startNode 
{ 
    _startNode = startNode; 
    [self setNeedsDisplay]; 
} 

- (void) setEndNode:(NodeView*)endNode 
{ 
    _endNode = endNode; 
    [endNode addObserver:self forKeyPath:@"endNode" options:NSKeyValueObservingOptionNew context:nil]; 
    [self setNeedsDisplay]; 
} 

-(id)initWithLayer:(id)layer 
{ 
    self = [super initWithLayer:layer]; 
    return self; 
} 

-(void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change: (NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"endNode"]) 
    { 
    // process here 
    } 
    NSLog(@"View changed its geometry"); 
} 

- (void)drawInContext:(CGContextRef)ctx 
{ 
    NSLog(@"DRAW"); 

    CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor); 
    CGContextSetLineWidth(ctx, 2); 
    CGContextMoveToPoint(ctx, _startNode.center.x, _startNode.center.y); 
    CGContextAddLineToPoint(ctx, _endNode.center.x, _endNode.center.y); 
    CGContextStrokePath(ctx); 
} 
@end 

이은을 추가 제 1 및 제 2 노드 중심 위치로부터의 라인. 끝 노드에 대한 관찰자를 추가하려고 시도했지만 올바르게 수행하고 있다고 생각하지 않습니다. observeValueForKeyPath 메서드를 트리거 할 수 없습니다. 내 생각 엔 잘못된 위치에 관찰자를 추가했다는 것입니다.

답변

2

문제는 관찰자를 추가하는 위치가 아니고 관찰해야 할 것이 있습니다. endNode를 endNode에서 keyPath로 사용하고 있는데 작동하지 않습니다 (endNode는 드래그 할 때 변경되지 않습니다) . 관찰하고 싶은 endNode의 속성이 중심입니다.

당신은 다음에 "센터"관찰하고있는 키 패스를 변경하고 observeValueForKeyPath의 구현을 변경해야 ofObject을 : 변경 : 문맥 :

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

가 나는를 추가하여 테스트과 같이 팬 제스처 인식기를 nodeViews 중 하나에 연결하고 두 노드를 연결하는 선이 끌 때 적절하게 업데이트되었습니다.

+0

도움 주셔서 감사합니다. 사실 아주 간단합니다. 이해하려고 할 때 피곤했을 것입니다. 나는 한가지 더 질문이있다. 관찰자를 언제 어떻게 제거해야합니까? 노드를 제거하고 선과 관찰자를 제거해야합니까? – freddy

+1

@freddy, 노드를 제거하는 경우와 같은 방법으로 관찰자를 제거해야합니다. 이 컨트롤러에서 벗어나면 viewDidDisAppear 또는 dealloc에서 모든 관찰자를 제거해야합니다. – rdelmar

관련 문제