只要手指移動到視圖上,下面的代碼就會以300毫秒的充氣動畫膨脹視圖,並且只要觸摸位於外面,視圖就會縮回視圖。沒有panGestureRecognizerRequired。
@interface CustomView : UIView
{
BOOL hasExpanded;
CGRect initialFrame;
CGRect inflatedFrame;
}
@end
@implementation CustomView
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
hasExpanded = NO;
initialFrame = frame;
CGFloat inflateIncrement = 50.0f;
inflatedFrame = CGRectMake(self.frame.origin.x-(inflateIncrement*0.5f),
self.frame.origin.y-(inflateIncrement*0.5f),
self.frame.size.width+inflateIncrement,
self.frame.size.height+inflateIncrement);
}
return self;
}
-(void)forceDeflate
{
if (hasExpanded)
{
//start deflating view animation
[UIView animateWithDuration:0.3 animations:^{
self.frame = initialFrame;
}];
hasExpanded = NO;
}
}
-(void)inflateByCheckingPoint:(CGPoint)touchPoint
{
if(!hasExpanded)
{
if(CGRectContainsPoint(self.frame,touchPoint))
{
//start inflating view animation
[UIView animateWithDuration:0.3 animations:^{
self.frame = inflatedFrame;
}];
hasExpanded = YES;
}
}
else
{
if(!CGRectContainsPoint(self.frame,touchPoint))
{
//start deflating view animation
[UIView animateWithDuration:0.3 animations:^{
self.frame = initialFrame;
}];
hasExpanded = NO;
}
}
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *singleTouch = [touches anyObject];
CGPoint touchPoint = [singleTouch locationInView:self.superview];
[self inflateByCheckingPoint:touchPoint];
}
-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
UITouch *singleTouch = [touches anyObject];
CGPoint touchPoint = [singleTouch locationInView:self.superview];
[self inflateByCheckingPoint:touchPoint];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
[self forceDeflate];
}
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[self forceDeflate];
}
@end