How to animate the objects in iphone sdk? - iphone

I'm using UIImageViews. I'd like this behaviour: if we touch the UIImageView it needs to zoom double and if the user remove his finger set the UIImageView to the actual position of the finger... How can I do?
Can any one please tell me the code for this?
Thanks in advance

U can use UIScrollView for this, with UIImageView as a sub-view of the scroll view.
For this, U need to sub-class UIScrollView to write a custom scroll view.
It will have all the properties of UIScrollView. Only thing, U have to override touchesEnded: method, which will notify the superview. So in the superview, again u can set the zoomscale to 1, to make it to actual position.

implement the delegate methods touchesBegan:withEvent: and – touchesEnded:withEvent:
in touches began method change the frame of the imageview to double the size of the imageview and in touchesEnded change the frame to the original size.
while declaring the image enable user interaction on it
UIImageView *imageview=[[UIImageView alloc] init];
imageview.userInteractionEnabled=YES;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
imageview.frame=CGRectMake(0,0,20,20);
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
imageview.frame=CGRectMake(0,0,40,40);
}
TNX

Related

Disable touch events on certain areas of iPhone screen

I want to disable touches on all areas of the screen apart from a specific few points (e.g buttons). I.e. I don't want 'touchesBegan' to trigger at all when I tap anything other than a button. Calling
self.view.userInteractionEnabled = NO;
has the desired effect for not registering touches, but then of course I can't tap any buttons. I basically want the button to still work, even if there are 5 points touching the screen, i.e. all touch inputs have been used up, and the button represents the 6th.
Is this possible?
I've tried inserting a view with userInteraction disabled below my buttons, but it still registers touches when the user taps the screen. It seems the only way to disable touch registering is to do so on the entire screen (on the parent UIView).
UPDATE:
I've tried using gesture recognizers to handle all touch events, and ignore those that don't qualify. Here is my code:
#interface ViewController : UIViewController <UIGestureRecognizerDelegate>
...
- (void)viewDidLoad
{
[super viewDidLoad];
UIGestureRecognizer *allRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:nil];
allRecognizer.delegate = self;
[self.view addGestureRecognizer:allRecognizer];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
CGPoint coords = [touch locationInView:self.view];
NSLog(#"Coords: %g, %g", coords.x, coords.y);
if (coords.y < 200) {
[self ignoreTouch:touch forEvent:nil];
return TRUE;
}
return FALSE;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(#"%i touch(es)", [touches count]);
}
However the screen still 'reads' the touches, so if I place 5 fingers down, the 6th one won't trigger a button press...
You need to set up an invisible UIButton and lay it between the view that should not register touches and the UIButtons that should still be active.
Now you need to set the invisible button's 'userInteractionEnabled':
//userInteractionEnabled == NO => self.view registeres touches
//userInteractionEnabled == YES => self.view doesn't register touches
[_invisibleButton setUserInteractionEnabled:NO];
What really matters in this solution is that both - the invisible and the visible buttons are direct subviews of the VC's view.
You can download an example project from my dropbox:
https://dl.dropboxusercontent.com/u/99449487/DontTapThat.zip
However this example just prevents the handling of certain touches. Completly ignoring input isn't technically possible: Third party apps are not responsible for for detecting input. They are just responsible for handling input. The detection of touch input is done iOS.
The only way to build up a case like you describe it in the comments is to hope that iOS won't interpret the input of your case as a "finger" because it's most likely going to cover an area that's way bigger than a finger.
So in conclusion the best way would be to change the material of the case you're about to build or at least give it a non conductive coating. From a third party developers point of view there is no way to achieve your goals with software if there is a need for 5 fingers as described in the comments.
There is couple of methods in UIView that you can override:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; // default returns YES if point is in bounds
This should prevent to call touchBegin and other methods.
Regards.
I have a nice solution for this. What ever the area you want to hide the interaction place a transparent button on top of the area.
touchesBegan is a default method so it must call all the time when touch happens on view so there is no way-out, But you can still do one thing set
self.buttonPlayMusic.userInteractionEnabled = FALSE;
for the object you don't need touch may be this could be help you with your desired output.
Have you tried using a UIScrollView as the background ? i.e the area where you do not want touch events to be fired.
UIScrollView does not call the touch methods.
You can add UIImageView Control on that area where you want to disable touch event.you can add UIImageView object as top of self.view subViews.
Example
//area -- is that area where you want to disable touch on self.view
UIImageView *imageView=[[UIImageView alloc]initWithFrame:area];
[self.view addSubView:imageView];
You touchDelegate will always call in this way, but if you are doing some task on touch then you can do your task like this way.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
UIButton *touchObject=(UIButton*)[touch view];
if ([touchObject isKindOfClass:[UIButton class]])
{
//Do what ever you want on button touch
}
else{
return;
}
}

How to perform some Action on imageview clicked?

I'm working on a photo Collage application. I want to perform an action on image view so any one can help me to solve my problem. when i pick image from photo library and shown on image view after when double click on image view i want to push or present a new view to crop this image .....so anyone tell me what i do to solve my problem...
Use a UIButton of type custom and put an image inside it. And you are done.
Add the Gesture for ImageView
UITapGestureRecognizer *sg=[[UITapGestureRecognizer alloc] initWithTarget:self action:#selector(HandleEvent)];
sg.numberOfTapsRequired=2;
[BottomBar addGestureRecognizer:sg];
[sg release];
and do your task here:
-(void)HandleEvent
{
// your task
}
Thanks
You should use a UIButton instead of an UIImageView. You can set its style to custom and then asign it an image. UIButton provides all the methods for double tap already built in.
If you are using UIImageView, make sure you use setUserInteractionEnabled:YES. Then you need to check your touches in touchesBegan, ended, (canceled).
You are set on using UIImageView, you will have to subclass UIImageView and override the touch methods you want to intercept. For example:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// Call super to make sure you don't lose any functionality
[super touchesBegan:touches withEvent:event];
// Perform the actions you want to perform with the tap.
}
Using UIButtons as replacements for your UIImageViews is a great idea you can just drag a connection from each button to an outlet in your view controller and handle the action. You can set the background image on the buttons as you are doing currently with the UIImageViews. Set your button type to custom and you'll be good to g
If you are using UIImageView class ,first set setUserInteractionEnabled:YES . Then set UITapGestureRecognizer event to image view.
try this
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint locationPoint = [[touches anyObject] locationInView:self.view];
CGPoint viewPoint = [imageView convertPoint:locationPoint fromView:self.view];
if ([imageView pointInside:viewPoint withEvent:event]) {
//do something
}
}
Make a button, and clear its color. On the back of button, put your image view, so that your imageview seems to be visible and the button doesn't. Now attach event to the button.

Avoid moving two views at the same time

I have several UIImageView as subview of a UIView that act as a canvas. The ImageViews receive touch events, so I can move them.
If I pan two views, each finger on each of them I can move two views at the same time. I don't want that.
I checked the maximumNumberOfTouches property on the superview but it affects that view, but it doesn't prevent that each other subview receives the touch event.
Any ideas how to avoid this behavior?
Thanks
How about just setting a flag that an image view is already moving, and the pan gesture on all views check that flag before actually moving their views? Just set the flag to false once the view has stopped moving.
you may do like this , extend UIImageView as a Custom UIView may called YouImageView
in the touch event
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
for ( UIView *v in self.superview.subviews )
{
if ( v != self )
{
v.userInteractionEnabled = NO;
}
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
for ( UIView *v in self.superview.subviews )
{
v.userInteractionEnabled = YES;
}
}
done!

Passing touch events to uiimageview within a scrollview added as subview to view

I have added one scrollview and imageview to my view. When I touch on this imageview my scrollview scrolls. And within my scrollview there are lots of imageviews which have touch events written separately.
Here is the view hierarchy
View
|
|
------- --------
| |
imageView1 scrollview
|
...........................
| | |.....|
imageviews2
Imageview1 is above imagesview2 in appearance.
And when I scroll the scrollview it is not possible to touch some of the imageViews within the scrollview as it comes behind the imageview within view.
How can I pass the touch events to the imageviews2 whenever it is behind imageview1.
You'll need to subclass UIView and override
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
in that subclass to skip imageView1.
You might get away with subclassing UIImageView and instantiating imageView1 as a member of that class, and overriding pointInside
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{ return NO; }
don't forget also to uncheck "delays content touches" and "cancellable content touches" on your scrollview !
I hope this answer might be useful for someone. I have done it without using hittest.
Took all the subviews in scrollview and checked if it is an image view and did the following.
Passed the touchevents to another view using [view touchesBegan:touches withEvent:event]; we have to write the same in touchesMoved and touchesEnded also.
Thanks,
Joku
You need to pass the touch event to the UIViews that are outside the bounds of the parent view.
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
// Convert the point to the target view's coordinate system.
// The target view isn't necessarily the immediate subview
CGPoint pointForTargetView = [self.targetView convertPoint:point fromView:self];
if (CGRectContainsPoint(self.targetView.bounds, pointForTargetView)) {
// The target view may have its view hierarchy,
// so call its hitTest method to return the right hit-test view
return [self.targetView hitTest:pointForTargetView withEvent:event];
}
return [super hitTest:point withEvent:event];
}
https://developer.apple.com/library/ios/qa/qa2013/qa1812.html

Change the text in a subview dynamically

I have created a 3 Subviews to MyView by creating new class inherits from UIView.
then i tried to change text in a particular subview say second sub view.
But its not updating.So how to do this...
EDIT
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CALayer *hitLater = [self layerForTouch:[touches anyObject]];
if ([hitLater isKindOfClass:[Tile class]])
{
Tile *tile = (Tile *)hitLater;
heldTile = tile;
[tile draw2];
[tile setNeedsDisplay];
}
}
Thanks in advance..
If you want a better answer show some code and how you add the text to your UIView subclasses etc.
But maybe you have to call setNeedsDisplay on your subviews so they get a redraw.