Эффект, как линии подключения Interface Builder на iPhone - PullRequest
0 голосов
/ 17 июля 2010

Привет, я бы хотел кое-что помочь. В моем приложении у меня есть UITableView, который заполнен пользовательскими ячейками, которые представляют изображения. (т. е. выбор строки отображает изображение в представлении изображения).

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

Раньше я никогда не рисовал линии в своем приложении, поэтому я не знаю, как это сделать (поэтому я просто ищу ссылку на учебное пособие или определение класса), и, во-вторых, какие проблемы у меня возникнут с момента начала линия находится в UITableViewCell, а конечная точка находится в главном окне?

1 Ответ

0 голосов
/ 17 июля 2010

Я уже делал это раньше, поэтому могу дать вам точный код: D

Это только часть рисования, вы реализуете сенсорные события (в отдельном классе, в противном случае удалите self.userInteractionEnabled = NO; в файле .m

Перетаскиваемая BOOL сообщает LineView, следует ли рисовать линию.

LineView.h

#import <UIKit/UIKit.h>

@interface LineView : UIView 
{
    CGPoint start;
    CGPoint end;

    BOOL dragged;
}

@property CGPoint start, end;
@property BOOL dragged;

@end

LineView.m

#import "LineView.h"

@implementation LineView

@synthesize start, end, dragged;

- (id)initWithFrame:(CGRect)frame 
{
    if (self = [super initWithFrame: frame])
    {
        self.userInteractionEnabled = NO;
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

#pragma mark Setters
-(void) setStart: (CGPoint) s
{
    start = s;
    [self setNeedsDisplay];
}

-(void) setEnd: (CGPoint) e
{
    end = e;
    [self setNeedsDisplay];
}

#define LINE_COLOR   [UIColor redColor]
#define CIRCLE_COLOR [UIColor redColor]

#define LINE_WIDTH    5
#define CIRCLE_RADIUS 10

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

    if(dragged) {
        [LINE_COLOR setStroke];
        CGContextMoveToPoint(c, start.x, start.y);
        CGContextAddLineToPoint(c, end.x, end.y);        
        CGContextSetLineWidth(c, LINE_WIDTH); 
        CGContextClosePath(c);
        CGContextStrokePath(c);

        [CIRCLE_COLOR setFill];
        CGContextAddArc(c, start.x, start.y, CIRCLE_RADIUS, 0, M_PI*2, YES);
        CGContextClosePath(c);
        CGContextFillPath(c);

        CGContextAddArc(c, end.x, end.y, CIRCLE_RADIUS, 0, M_PI*2, YES);
        CGContextClosePath(c);
        CGContextFillPath(c);
    }
}

- (void)dealloc 
{
    [super dealloc];
}

@end
...