рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдкрд╛рд░реНрдЯ 3 рдореЗрдВ рдмреНрд▓реЙрдХ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

рдЬреИрд╕рд╛ рдХрд┐ рд╡рд┐рд╖рдп рдореЗрдВ рд╣реИ - "рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдкрд╛рд░реНрдЯ 2 рдореЗрдВ рдмреНрд▓реЙрдХ рдФрд░ рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░" , рд╣рдо рд▓рд╛рдЗрд╡ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред
рдпрд╣рд╛рдВ рд╣рдо рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред

5. UIView рдПрдирд┐рдореЗрд╢рди, рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдХреНрд░рдоред

рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдирд┐рдореЗрд╢рди (рдмреНрд▓реЙрдХ рдХреЗ рдмрд┐рдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдЯрди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рдХреЛрдб рдореЗрдВ рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдХреНрд░рдо рдмрджрд▓реЗрдВред

рдкрд╣рд▓рд╛ рдЪрд░рдг

рдЖрдЗрдП рдЪрд╛рд░ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдПрдВ: "рдмрдЯрди рдХреЛ рдКрдкрд░ рд▓реЗ рдЬрд╛рдПрдВ", "... рдбрд╛рдЙрди", "... рд░рд╛рдЗрдЯ" рдФрд░ "... рд▓реЗрдлреНрдЯ"ред рддрджрдиреБрд╕рд╛рд░, рддрд░реАрдХреЛрдВ рдореЗрдВ: MoveUpAnimation, MoveDownAnimation, MoveRightAnimation рдФрд░ MoveLeftAnimationред
рдпрд╣рд╛рдБ рдПрдХ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
static const CGFloat button_offset_ = 20.f;

-( void )moveUpAnimation
{
[ UIView beginAnimations: nil context: nil ];

CGFloat new_y_ = self.animatedButton.frame.origin.y
- ( self.view.frame.size.height - button_offset_ * 2 )
+ self.animatedButton.frame.size.height;
self.animatedButton.frame = CGRectMake( self.animatedButton.frame.origin.x
, new_y_
, self.animatedButton.frame.size.width
, self.animatedButton.frame.size.height );

[ UIView commitAnimations ];
}


* This source code was highlighted with Source Code Highlighter .

рдлрд┐рд░ рд╣рдо рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпреЗ рдЪрд╛рд░реЛрдВ рдПрдирд┐рдореЗрд╢рди рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдмрдЯрди рдХреЛ рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рдШреБрдорд╛рдПрдБред рдЗрди рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗрд╡рд▓ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╣реИ:
-(IBAction)animateButtonAction:( id )sender_
{
[ self moveUpAnimation ];
[ self moveRightAnimation ];
[ self moveDownAnimation ];
[ self moveLeftAnimation ];
}


* This source code was highlighted with Source Code Highlighter .

рдХреБрдЫ рдирд╣реАрдВ рджреЗрдЧрд╛ рд╣рдо рдХреЗрд╡рд▓ рдирд╡реАрдирддрдо рдПрдиреАрдореЗрд╢рди рджреЗрдЦреЗрдВрдЧреЗред рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдЕрдЧрд▓рд╛ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрдиреА рдпреЛрдЬрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдПрдиреАрдореЗрд╢рди рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдЕрдЧрд▓реЗ рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдореЗрдВ, рд╕рдВрджрд░реНрдн рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрдиреАрдореЗрд╢рди рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
// ()
@ interface JFFNextAnimation : NSObject

@property ( nonatomic, retain ) UIViewAnimationsExampleViewController* controller;
@property ( nonatomic, assign ) SEL nextAnimationSelector;

@end

-( void )moveUpAnimation
{
JFFNextAnimation* next_animation_ = [ JFFNextAnimation new ];
//
next_animation_.controller = self;
next_animation_.nextAnimationSelector = @selector( moveRightAnimation );
//
[ UIView beginAnimations: nil context: next_animation_ ];

CGFloat new_y_ = self.animatedButton.frame.origin.y
- ( self.view.frame.size.height - button_offset_ * 2 )
+ self.animatedButton.frame.size.height;
self.animatedButton.frame = CGRectMake( self.animatedButton.frame.origin.x
, new_y_
, self.animatedButton.frame.size.width
, self.animatedButton.frame.size.height );

//
[ UIView setAnimationDelegate: self ];

[ UIView commitAnimations ];
}

// moveDownAnimation, moveRightAnimation moveLeftAnimation
-( void )animationDidStop:( NSString* )animation_id_
finished:( NSNumber* )finished_
context:( void * )context_
{
//
JFFNextAnimation* context_object_ = context_;
[ context_object_.controller performSelector: context_object_.nextAnimationSelector ];
[ context_object_ release ];
}

-(IBAction)animateButtonAction:( id )sender_
{
//
[ self moveUpAnimation ];
}

* This source code was highlighted with Source Code Highlighter .

рдЕрдм рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдПрдиреАрдореЗрд╢рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдмрдЯрди рдХреЛ рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╡рд╛рдорд╛рд╡рд░реНрдд рдШреБрдорд╛рдПрдВред рдлрд┐рд░ рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдореВрд╡рдЕрдкрдиреЗрдо, рдореВрд╡рдбрд╛рдЙрдирдПрдирд┐рдореЗрд╢рди, MoveRightAnimation рдФрд░ MoveLeftAnimation рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рд╣реЛ рдЬрд╛рдПред

рджреВрд╕рд░рд╛ рдЪрд░рдг

рд╣рдо рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдирд┐рдореЗрд╢рди рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдЧрд▓реЗ рдПрдирд┐рдореЗрд╢рди рдХреЗ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╡рд░реНрддрдорд╛рди рдПрдирд┐рдореЗрд╢рди рдХреЗ рдмрд╛рдж рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдПрдирд┐рдореЗрд╢рдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ:
@ interface JFFNextAnimation : NSObject

@property ( nonatomic, retain ) UIViewAnimationsExampleViewController* controller;
// ,
@property ( nonatomic, retain ) NSMutableArray* nextAnimations;

@end


* This source code was highlighted with Source Code Highlighter .

рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХреЛрдб MoveUpAnimation, MoveDownAnimation, MoveRightAnimation рдФрд░ MoveLeftAnimation рдХреЛ рднреА рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
// ,
//
-( void )moveUpAnimationWithNextAnimation:( JFFNextAnimation* )next_animation_
{
[ UIView beginAnimations: nil context: next_animation_ ];

CGFloat new_y_ = self.animatedButton.frame.origin.y
- ( self.view.frame.size.height - button_offset_ * 2 )
+ self.animatedButton.frame.size.height;
self.animatedButton.frame = CGRectMake( self.animatedButton.frame.origin.x
, new_y_
, self.animatedButton.frame.size.width
, self.animatedButton.frame.size.height );

[ UIView setAnimationDelegate: self ];

[ UIView commitAnimations ];
}

// moveDownAnimation, moveRightAnimation moveLeftAnimation


* This source code was highlighted with Source Code Highlighter .

рдПрдиреАрдореЗрд╢рди рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЛ рднреА рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
-( void )animationDidStop:( NSString* )animation_id_
finished:( NSNumber* )finished_
context:( void * )context_
{
// -
if ( !context_ )
return ;

JFFNextAnimation* context_object_ = context_;

//
NSString* next_animation_string_ = [ context_object_.nextAnimations objectAtIndex: 0 ];
next_animation_string_ = [ [ next_animation_string_ retain ] autorelease ];
//
[ context_object_.nextAnimations removeObjectAtIndex: 0 ];

SEL next_animation_sel_ = NSSelectorFromString( next_animation_string_ );

if ( [ context_object_.nextAnimations count ] == 0 )
{
//
//
[ context_object_.controller performSelector: next_animation_sel_
withObject: nil ];
//
[ context_object_ release ];
}
else
{
//
[ context_object_.controller performSelector: next_animation_sel_
withObject: context_object_ ];
}
}

* This source code was highlighted with Source Code Highlighter .

рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЬрд┐рд╕ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд╣рдордиреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдЕрдм рдПрдирд┐рдореЗрд╢рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
-(IBAction)animateButtonAction:( id )sender_
{
JFFNextAnimation* next_animation_ = [ JFFNextAnimation new ];
next_animation_.controller = self;
//
next_animation_.nextAnimations = [ NSMutableArray arrayWithObjects:
@"moveUpAnimationWithNextAnimation:"
, @"moveLeftAnimationWithNextAnimation:"
, @"moveDownAnimationWithNextAnimation:"
, nil ];

//
[ self moveRightAnimationWithNextAnimation: next_animation_ ];
}


* This source code was highlighted with Source Code Highlighter .

рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдб рдЧрд┐рд╣рдм рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдо:

рдмреЗрд╢рдХ, рд╣рдордиреЗ рд╡рд┐рд╖рдп рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди рдореВрд▓реНрдп рдЕрдзрд┐рдХ рд╣реИ, рдХреЛрдб рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп рддрд╛рд░), рдЬрдЯрд┐рд▓ (рдЪрдпрдирдХрд░реНрддрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдХрд╛ рднреНрд░рдорд┐рдд рддрд░реНрдХ), рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡рдгред рд╣рдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ (рд╡рд┐рд╖рдп рдХреЗ рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░) рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдФрд░ рдЗрд╕рд▓рд┐рдП ...

рддреАрд╕рд░рд╛ рдЪрд░рдг

рдмреНрд▓реЙрдХ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдирд┐рдореЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдиреАрдореЗрд╢рди рд╕рдВрджрд░реНрдн рд╡рд░реНрдЧ - JFFNextAnimation рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдПрдиреАрдореЗрд╢рди рд╡рд┐рдзрд┐ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдЕрдм рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред MoveUpAnimation рд╡рд┐рдзрд┐ рдЗрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рддреА рд╣реИ:
-(JFFSimpleBlock)moveUpAnimationBlock
{
return [ [ ^
{
CGFloat new_y_ = self.animatedButton.frame.origin.y
- ( self.view.frame.size.height - button_offset_ * 2 )
+ self.animatedButton.frame.size.height;
self.animatedButton.frame = CGRectMake( self.animatedButton.frame.origin.x
, new_y_
, self.animatedButton.frame.size.width
, self.animatedButton.frame.size.height );
} copy ] autorelease ];
}


* This source code was highlighted with Source Code Highlighter .

рдПрдиреАрдореЗрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:
//
//
-(JFFSimpleBlock)animationBlockWithAnimations:( JFFSimpleBlock )animations_
completion:( JFFSimpleBlock )completion_
{
// ,
//
completion_ = [ [ completion_ copy ] autorelease ];
return [ [ ^
{
[ UIView animateWithDuration: 0.2
animations: animations_
completion: ^( BOOL finished_ )
{
if ( completion_ )
completion_();
} ];
} copy ] autorelease ];
}


* This source code was highlighted with Source Code Highlighter .

рдФрд░ рдПрдирд┐рдореЗрд╢рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
-(IBAction)animateButtonAction:( id )sender_
{
// , ,
JFFSimpleBlock move_left_animation_block_ = [ self moveLeftAnimationBlock ];
//completion: - ,
move_left_animation_block_ = [ self animationBlockWithAnimations: move_left_animation_block_
completion: nil ];

JFFSimpleBlock move_down_animation_block_ = [ self moveDownAnimationBlock ];
//completion: - - "move left"
move_down_animation_block_ = [ self animationBlockWithAnimations: move_down_animation_block_
completion: move_left_animation_block_ ];

JFFSimpleBlock move_right_animation_block_ = [ self moveRightAnimationBlock ];
//completion: - - "move down"
move_right_animation_block_ = [ self animationBlockWithAnimations: move_right_animation_block_
completion: move_down_animation_block_ ];

//
JFFSimpleBlock move_up_animation_block_ = [ self moveUpAnimationBlock ];
//completion: - - "move right"
move_up_animation_block_ = [ self animationBlockWithAnimations: [ self moveUpAnimationBlock ]
completion: move_right_animation_block_ ];

//
move_up_animation_block_();
}


* This source code was highlighted with Source Code Highlighter .

рдЕрдм, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг (рдмреНрд▓реЙрдХ рдХреЗ рдмрд┐рдирд╛ рдПрдирд┐рдореЗрд╢рди) рдореЗрдВ, рд╣рдо рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдирд┐рдореЗрд╢рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдЙрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдерд╛, рд▓реЗрдХрд┐рди рд╣рдо рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд░реБрдХреЗрдВрдЧреЗред

рдЪреМрдерд╛ рдЪрд░рдг

рдЪрд▓рд┐рдП рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдХреНрд░рдо рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдирдпрд╛ рдмреНрд▓реЙрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреНрд░рдо рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдмреНрд▓реЙрдХ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ JFFAsyncOperation рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдиреАрдореЗрд╢рдирдмреНрд▓реИрдХрд╡рд┐рдердиреЗрдо рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ: рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдп рдХрд░реЗрдВ:
-(JFFAsyncOperation)animationBlockWithAnimations:( JFFSimpleBlock )animations_
{
return [ [ ^( JFFAsyncOperationProgressHandler progress_callback_
, JFFCancelHandler cancel_callback_
, JFFDidFinishAsyncOperationHandler done_callback_ )
{
done_callback_ = [ [ done_callback_ copy ] autorelease ];
[ UIView animateWithDuration: 0.2
animations: animations_
completion: ^( BOOL finished_ )
{
if ( done_callback_ )
done_callback_( [ NSNull null ], nil );
} ];
//
JFFCancelAsyncOpration cancel_block_ = ^{ /*do nothing*/ };
return [ [ cancel_block_ copy ] autorelease ];
} copy ] autorelease ];
}


* This source code was highlighted with Source Code Highlighter .

рдФрд░ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:
-(IBAction)animateButtonAction:( id )sender_
{
JFFSimpleBlock move_right_animation_block_ = [ self moveRightAnimationBlock ];
JFFAsyncOperation move_right_async_block_ = [ self animationBlockWithAnimations: move_right_animation_block_ ];

JFFSimpleBlock move_up_animation_block_ = [ self moveUpAnimationBlock ];
JFFAsyncOperation move_up_async_block_ = [ self animationBlockWithAnimations: move_up_animation_block_ ];

JFFSimpleBlock move_left_animation_block_ = [ self moveLeftAnimationBlock ];
JFFAsyncOperation move_left_async_block_ = [ self animationBlockWithAnimations: move_left_animation_block_ ];

JFFSimpleBlock move_down_animation_block_ = [ self moveDownAnimationBlock ];
JFFAsyncOperation move_down_async_block_ = [ self animationBlockWithAnimations: move_down_animation_block_ ];

//
// - sequenceOfAsyncOperations
JFFAsyncOperation result_animation_block_ = sequenceOfAsyncOperations(
move_right_async_block_
, move_up_async_block_
, move_left_async_block_
, move_down_async_block_
, nil );

// ,
result_animation_block_( nil, nil, nil );
}


* This source code was highlighted with Source Code Highlighter .

рдЧрд┐рд╣рдм рдкрд░ рдЖрдк рд╕рднреА рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрджрд┐ рдпрд╣ рд╡рд┐рд╖рдп рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/In121958/


All Articles