I want to build an App that enables you to draw in an image, while zooming in.
I have a working code that lets you draw into an image, but the problem is that I also want to zoom in. I need to find a way to zoom and move around with 2 Fingers and draw with 1 Finger.
I tried:
self.scrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
But the problem is that this disables the drawing.
I also tried to add an UIPanGestureRegognizer but that won't fit in the framework I prefer to use.
So I am asking for a way to make scrollView ignoring the 1 Finger gesture or a drawing Framework that supports zooming.
Set your UIViewController (or UIView, whatever you use for showing) as delegate for your recognizers. Then add gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: and return YES for your case or always if you don't have another recognizers.
Related
I am developing an iOS drawing application where the main feature is that a user can load an image as background and then he can start finger drawing on top of it, zooming and panning the image with the draws on top of the image itself.
The schema of the application is the following one.
MainUiView->UIScrollView->UIImageView
Fingers drawing and tracking is managed on the touchesBegan, touchesMoved, touchesEnded override of the UIResponder.
The Zoom and Panning of the UIImageView is managed by the UIScrollViewDelegate implementation.
I have a button that switches the app mode from Drawing to Zooming and Panning mode in the following way:
if you want to draw:
[scrollView setUserInteractionEnabled:NO];
[imageView setUserInteractionEnabled:YES];
so the touches are managed in the touchesBegan, touchesMoved, touchesEnded methods.
if you want to Pan and Zoom with two fingers using the Pinch to Zoom gesture
[scrollView setUserInteractionEnabled:YES];
[imageView setUserInteractionEnabled:NO];
so the two fingers gesture is managed by the UIScrollViewDelegate
Now I am trying to evolve the app removing the button to switch from draw to zoom and pan mode.
My idea was to track the two fingers presence in the touchesBegan and then to disable the user interaction in the UIImageView to enable the user interaction in the scrollview, but the problem is that after doing this the touches are still managed in the touchesMoved method, nothing comes to the scrollViewDelegate until I lift my fingers from screen, after that, if I punt fingers again on the screen everything is managed by the scrollViewDelegate.
So to sum up: is it possible to stop the touches cycle after touchesBegan and propagate it to the ScrollViewDelegate?
If this is not possible, how can I achieve the zoom, panning and drawing feature on a UImageView? Should I remove the scrollview and try to zoom and pan the UImageView through the UIResponder methods ?
Thanks for help
Try changing your implementation to use gesture recognisers instead of touch handling using the UIResponder methods.
Main benefits of this approach are :
You can use UIPanGestureRecognizer for drawing, or even create a
custom recogniser
You can have dependency relationships between recognisers, using
requireGestureRecognizerToFail, even across views
You can loop through all recognisers on a view and disable only specific set of gestures without disabling touches on the entire view
Gesture recognisers have the same touch related methods, which you can use to move your touch handling code from current implementation over to the gestures
So, your image view will have either pan or your custom gesture recogniser, with single touch, for drawing, and you can loop through scrollview's recognisers, and mark them not trigger if 'draw' gesture is triggered, using requireGestureRecognizerToFail.
With this, you do not need to enable/disable user interaction on any of the views, although you will have to do a it of trial-and-error to get all gestures to work with each other correctly.
Happy coding :)
I'm making a drawing app and I would like it to accept pictures that are bigger than the screen. For this, I put an image view in a scroll view. However, when the drawing tool is enabled I want to disable the detection of touch events on the scroll view so that I can use the touchesBegan, touchesMoved and touchesEnded methods for drawing. It seems that even if the scroll view has scroll disabled, these methods are not getting called. How can I go about doing this?
Try turning userInteractionEnabled to NO. Maybe it helps.. :)
- The functionality which is required by client is already implemented using UISwipeGestureRecognizer but I am not able to give animation which is needed.
- I want the animation of dragging image as its in paging effect of UIScrollview.
Let me explain in detail:
- In UIScrollView with paging enabled, when we drag image, it will be dragged behind our finger not just slight swipe.
- In my case its moving away as soon as the finger moves over the image, so I want the animation of image to be sliding as far as my fingers moves and on leaving it should move away.
-Friends, I don't want curl effect but I only want swipping functionality as far as my finger moves.
I think you can take a look at this repository and you can find what you need if you edit this repository code and use PanGestureRecognizer instead of SwipeGestureRecognizer in this repository.
https://github.com/agrawalmahesh/MKImageSlideshow
You need to disable paging property of the UIScrollView.
Essentially what I'm trying to do is use this gesture functionality as demonstrated below
https://www.youtube.com/watch?v=tG3lzBDMRQQ
http://www.vogella.com/articles/AndroidGestures/article.html
Except instead of just setting a color, I want to be able to add a variety of visual effects to the lines drawn during a gesture motion.
IE: pulsating thickness / color changing / particle effects like a sparkler-stick firework etc.
Where would one start in attempting such a venture?
edit: One method I'm considering is to set the gesture color to transparent, but have a separate listener for touches as in some paint-type apps. And So it simultaneously creatures the gesture and draws the proper image over top of it. Would this work? Can the screen be listening for input from two views at once?
GestureOverlayView is a normal view which has the capability to draw on screen. You can simply extend GestureOverlayView and add your custom effects. You can set your custom paint style, or you can override dispatchTouchEvent() to add your own effects while drawing it.
I'll try and keep it simple.
I have a UIScrollview with around 10 images attached. I currently have it so that i can touch an image and drag it around on the scroll view.
I did this by creating the subclass UIImageview and implementing the touchesMoved etc. I can still scroll the view fine, but the problem comes when trying to drag an image too fast. It seems the program first checks if the view is being scrolled and then fires touchesMoved in the UIImage class.
Is there anyway I can switch this around so that the first check is if an image is touched, then if not pass the response onto the scrollview.
Any help would be great. Thanks.
The simplest way to do this would be use one finger to move an image, and two fingers to scroll the view.
If you're on iOS 5, this is super easy:
self.scrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
If you want to support older versions of iOS, you have to do a little more work:
for (UIGestureRecognizer *gesture in self.scrollView.gestureRecognizers){
if ([gesture isKindOfClass:[UIPanGestureRecognizer class]]){
((UIPanGestureRecognizer *)gesture).minimumNumberOfTouches = 2;
}
}
If you want to use one-finger gestures for both, there are a few ways to do it. You could attach a UIPanGestureRecognizer to each image view. You might need to tell the scroll view's own UIPanGestureRecognizer to defer to the image view recognizers, using the requireGestureRecognizerToFail: message.
Another way would be to set the scroll view's UIPanGestureRecognizer's delegate to an object you create that implements the gestureRecognizer:shouldReceiveTouch: method. In that method, you can check whether the touch's view is one of your image views. If so, return NO to prevent the scroll view's pan gesture recognizer from activating.
Your question is a little confusing to me but I will assume that you have a UIScrollView with 10 UIImageViews inside it which you want to drag around.
My suggestion would be to use a gesture recognizer (UIPanGestureRecognizer) attached to every UIIImageView in order to implement the dragging behaviour. I find gesture recognizers to be a more solid approach on this kind of behavior.
If you don't know how to work with gesture recognizers, I can post a short code example to demonstrate how you can drag any type of UIView. Just ask in a comment and I will write it.