I had fun with this. The following code will capture the image from the button when touched, drag this image to alpha = 0.5 and drop it wherever your strokes end with alpha = 1.0. After that, it will continue to be dragged.
After importing QuartzCore, create a new file .. you should read:
#import <Foundation/Foundation.h> #import <QuartzCore/CAGradientLayer.h> #import <QuartzCore/CALayer.h> @interface DraggableImage : CAGradientLayer - (void)draw:(UIImage *)image; - (void)moveToFront; - (void)appearDraggable; - (void)appearNormal; @end
a .m should read:
Now in the main view controller add:
#import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> #import "DraggableImage.h" @interface YourViewController : UIViewController{ DraggableImage *heldImage; DraggableImage *imageForFrame[5]; // or however many UIButton *buttonPressed; int imageCount; } @property (weak, nonatomic) IBOutlet UIButton *imageButton; -(IBAction)buildImageLayerForButton:(UIButton *)sender; - (void)moveHeldImageToPoint:(CGPoint)location; - (CALayer *)layerForTouch:(UITouch *)touch;
imageButton in this case will be your Apple button. Now in your .m file add the following:
@synthesize imageButton; #pragma - mark Touches -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ CALayer *hitLayer = [self layerForTouch:[touches anyObject]]; if ([hitLayer isKindOfClass:[DraggableImage class]]) { DraggableImage *image = (DraggableImage *)hitLayer; heldImage = image; [heldImage moveToFront]; } hitLayer = nil; [super touchesBegan:touches withEvent:event]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ if (heldImage) { UITouch *touch = [touches anyObject]; UIView *view = self.view; CGPoint location = [touch locationInView:view]; [self moveHeldImageToPoint:location]; } } - (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ if (heldImage) { [heldImage appearNormal]; heldImage = nil; } } - (void)dragBegan:(UIControl *)c withEvent:ev { } - (void)dragMoving:(UIControl *)c withEvent:ev { UITouch *touch = [[ev allTouches] anyObject]; CGPoint touchPoint = [touch locationInView:self.view]; [self moveHeldImageToPoint:touchPoint]; } - (void)dragEnded:(UIControl *)c withEvent:ev { UITouch *touch = [[ev allTouches] anyObject]; CGPoint touchPoint = [touch locationInView:self.view]; [self moveHeldImageToPoint:touchPoint]; [heldImage appearNormal]; heldImage = nil; } -(IBAction)buildImageLayerForButton:(UIButton *)sender{ DraggableImage *image = [[DraggableImage alloc] init]; buttonPressed = sender; CGRect buttonFrame = sender.bounds; int buttonWidth = buttonFrame.size.width; int buttonHeight = buttonFrame.size.height; image.frame = CGRectMake(120, 24, buttonWidth*3, buttonHeight*3); image.backgroundColor = [UIColor lightGrayColor].CGColor; image.delegate = self; imageForFrame[imageCount] = image; [self.view.layer addSublayer:image]; [image setNeedsDisplay]; [image moveToFront]; [image appearDraggable]; heldImage = image; [self moveHeldImageToPoint:sender.center]; imageCount++; } - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx { UIGraphicsPushContext(ctx); DraggableImage *image = (DraggableImage *)layer; [image draw:[buttonPressed imageForState:UIControlStateNormal]]; UIGraphicsPopContext(); } - (void)moveHeldImageToPoint:(CGPoint)location { float dx = location.x; float dy = location.y; CGPoint newPosition = CGPointMake(dx, dy); [CATransaction begin]; [CATransaction setDisableActions:TRUE]; heldImage.position = newPosition; [CATransaction commit]; } - (CALayer *)layerForTouch:(UITouch *)touch { UIView *view = self.view; CGPoint location = [touch locationInView:view]; location = [view convertPoint:location toView:nil]; CALayer *hitPresentationLayer = [view.layer.presentationLayer hitTest:location]; if (hitPresentationLayer) { return hitPresentationLayer.modelLayer; } return nil; } -(void)viewDidLoad{ [imageButton addTarget:self action:@selector(dragBegan:withEvent:) forControlEvents: UIControlEventTouchDown]; [imageButton addTarget:self action:@selector(dragMoving:withEvent:) forControlEvents: UIControlEventTouchDragInside | UIControlEventTouchDragOutside]; [imageButton addTarget:self action:@selector(dragEnded:withEvent:) forControlEvents: UIControlEventTouchUpInside | UIControlEventTouchUpOutside]; [super viewDidLoad]; } - (void)viewDidUnload { [self setImageButton:nil]; [super viewDidUnload]; }
Et voila! Connect your button, set its image and drop copies all over the screen. :)
Note. I did not comment on anything, but I would be happy to answer any questions.
Hooray!
EDIT: fixed -(void)draw:(UIImage *)image{} so that it changes the image correctly.
source share