Перетащите изображения с панели инструментов для просмотра холста - PullRequest
0 голосов
/ 01 декабря 2011

Я хочу создать приложение, в котором мне нужна панель инструментов.Панель инструментов будет иметь различное количество объектов (изображений).Эти объекты должны быть перетаскиваемыми и размещаться на виде прямо над ним.

Это приложение для рисования, где пользователь может выбрать любую форму и место на холсте.Может кто-нибудь сказать мне лучшее, чтобы достичь этого?

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 01 декабря 2011

Жесткий.

Что бы я сделал, это сделал бы каждый элемент на панели инструментов UIView и переопределил touchSegan, touchesEnded и touchesMoved. Сделайте свой холст еще одним UIView. Когда пользователь щелкает элемент, чтобы перетащить, зарегистрируйте этот элемент где-нибудь, скажем, квадрат. затем, когда они упадут на холст, нарисуйте этот квадрат в этом месте. Чтобы это выглядело симпатично, вероятно, нужно было бы сделать UIImageView с альфа-версией, равной .4, чтобы двигаться с прикосновением пользователя, чтобы они знали, что перетаскивают, и где он приземлится.

Вот код. UIViewController.h

@class ToolBox;

@interface ViewController : UIViewController {

    IBOutlet UIView *canvas;

    IBOutlet ToolBox *toolBox;
}

@property (nonatomic, retain) UIView *canvas;
@property (nonatomic, retain) ToolBox *toolBox;

@end

UIViewController.m

#import "ViewController.h"
#import "ToolBox.h"
#import "Tool.h"

@implementation ViewController
@synthesize canvas, toolBox;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [[self toolBox] setCanvas:[self canvas]];

    Tool *tool = [[[Tool alloc] initWithFrame:CGRectMake(0,0,64,64)] autorelease];
    [tool setImageView:[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1.png"]] autorelease]];
    [tool setImage:[UIImage imageNamed:@"1.png"]];
    [tool addSubview:[tool imageView]];
    [tool setToolBox:[self toolBox]];

    [[self toolBox] addObject:tool];
}

@end

ToolBox.h

@class Tool;
@interface ToolBox : UIView {
    NSMutableArray *tools;

    UIView *canvas;

    UIImage *currentTool;
}

@property (nonatomic, retain) UIImage *currentTool;
@property (nonatomic, retain) NSMutableArray *tools;
@property (nonatomic, retain) UIView *canvas;

-(void)addObject:(Tool *)newTool;
-(void)updatePositions;

@end

ToolBox.m

@implementation ToolBox
@synthesize tools, canvas, currentTool;

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];

    if (self) {

    }

    return self;
}

-(void) dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];

    [super dealloc];
}

-(NSMutableArray *)tools {
    if(tools == nil) {
        [self setTools:[NSMutableArray array]];
    }

    return tools;
}

-(void)addObject:(Tool *)newTool {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(draggingTool:) name:@"Dragging New Tool" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(draggedTool:) name:@"Dragged Tool To" object:nil];
    [[self tools] addObject:newTool];

    [self updatePositions];
}

-(void)updatePositions {
    int x = 0;
    int y = 0;
    int width = 64;
    int height = 64;

    for(Tool *button in [self tools]) {
        [button setFrame:CGRectMake(x, y, width, height)];
        x += width;
        [self addSubview:button];
    }
}

-(void)draggingTool:(NSNotification *)notif {
    NSDictionary *dict = [notif userInfo];  

    UIImage *image = [dict valueForKey:@"Image"];

    [self setCurrentTool:image];
}

-(void)draggedTool:(NSNotification *)notif {
    UITouch *touch = [[notif userInfo] valueForKey:@"Touch"];   

    CGPoint point = [touch locationInView:canvas];

    UIImageView *imageView = [[[UIImageView alloc] initWithImage:currentTool] autorelease];
    [imageView setCenter:point];
    [canvas addSubview:imageView];
}

@end

Tool.h

@class ToolBox;

@interface Tool : UIView {
    UIImageView *imageView;
    UIImage *image;

    UIImageView *ghostImageView;

    ToolBox *toolBox;
}

@property (nonatomic, retain) UIImageView *imageView;
@property (nonatomic, retain) UIImage *image;
@property (nonatomic, retain) UIImageView *ghostImageView;
@property (nonatomic, retain) ToolBox *toolBox;

@end

Tool.m

#import "Tool.h"
#import "ToolBox.h"

@implementation Tool
@synthesize imageView, image, ghostImageView, toolBox;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"tool touches began");
    NSDictionary *dict = [NSDictionary dictionaryWithObject:[self image] forKey:@"Image"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Dragging New Tool" object:nil userInfo:dict];

    UITouch *touch = [touches anyObject];
    CGPoint center = [touch locationInView:[[self toolBox] canvas]];

    [self setGhostImageView:[[[UIImageView alloc] initWithImage:[self image]] autorelease]];
    [[self ghostImageView] setCenter:center];
    [[[self toolBox] canvas] addSubview:[self ghostImageView]];

    [[self ghostImageView] setAlpha:.4];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"tool touches ended");
    NSDictionary *dict = [NSDictionary dictionaryWithObject:[touches anyObject] forKey:@"Touch"];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Dragged Tool To" object:nil userInfo:dict];

    [self setGhostImageView:nil];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"tool touch moved");
    if([self ghostImageView] != nil) {
        UITouch *touch = [touches anyObject];
        CGPoint center = [touch locationInView:[[self toolBox] canvas]];
        NSLog(@"Ghost : %2f, %2f", center.x, center.y);
        [[self ghostImageView] setCenter:center];
    }
}

@end

Моя программа вышла вот так -

Начальный экран: инструмент готов к перетаскиванию на холст

Tool ready to be dragged and dropped

Уронил инструмент на холст

enter image description here

А вот и призрак для перехода

enter image description here

0 голосов
/ 01 декабря 2011

Я не совсем уверен, как это будет реализовано в задаче c, но я почти точно сделал то, что вы описываете в java.По сути, когда вы начинаете перетаскивать объект на панели инструментов, он распознает действие и сохраняет новый экземпляр элемента в том, что я называю транспортным контейнером, который по сути является глобальной статической переменной.Таким образом, когда действие перетаскивания конкурирует (т. Е. Падает), вы можете просто взять этот объект из контейнера и добавить его туда, куда он был отброшен.

...