1

apportable によるポータル アプリケーションでは、呼び出しを介して UIView *object のアニメーション (移動/スケール/アルファの変更) を作成する必要があります。

[UIView
 animateWithDuration:1.f
 delay:0.5f
 options:UIViewAnimationOptionAllowUserInteraction
 animations:^(void)
 {
     myview.center    = moveTo;
     myview.transform = transformTo;
     myview.alpha     = alphaTo;
 }
 completion:^(BOOL finished)
 {
     [self animationFinished];
 }];

今のところ遅延させるだけで、すぐにアニメーションコードと完了コードを実行します。

4

2 に答える 2

3

答えてくれてありがとう。でも「今日」のアニメーションが必要なので、次のクラスを作ります。それはうまくいかない仕事ですが、何もないよりはずっとましです。多分それは役に立つでしょう

AOTAnimate.h

//
//  AOTAnimate.h
//
//  Created by Andrei Bakulin on 18/11/2013.
//

#import <Foundation/Foundation.h>

@interface AOTAnimate : NSObject
{
    UIView          *view;

    NSInteger       animationTicksLeft;
    CGFloat         scaleX;
    CGFloat         scaleY;

    CGPoint         moveDelta;
    CGSize          scaleCurrent;
    CGSize          scaleDelta;
    CGFloat         alphaDelta;

    void (^completeAction)();
}

@property (nonatomic, assign)   CGFloat                 duration;
@property (nonatomic, assign)   CGFloat                 delay;
@property (nonatomic, assign)   CGFloat                 frequency;
@property (nonatomic, assign)   UIViewAnimationOptions  options;

@property (nonatomic, assign)   CGPoint                 moveFrom;
@property (nonatomic, assign)   CGAffineTransform       transformFrom;
@property (nonatomic, assign)   CGFloat                 alphaFrom;

@property (nonatomic, assign)   CGPoint                 moveTo;
@property (nonatomic, assign)   CGAffineTransform       transformTo;
@property (nonatomic, assign)   CGFloat                 alphaTo;

+ (AOTAnimate*)makeAnimationOnView:(UIView*)view_ duration:(CGFloat)duration_;
+ (AOTAnimate*)makeAnimationOnView:(UIView*)view_ duration:(CGFloat)duration_ delay:(CGFloat)delay_;

- (void)run;
- (void)runWithCompleteAction:(void (^)(void))complete_;

@end

AOTAnimate.m

//
//  AOTAnimate.m
//
//  Created by Andrei Bakulin on 18/11/2013.
//

#import "AOTAnimate.h"

@implementation AOTAnimate

@synthesize duration, delay, frequency, options;
@synthesize moveFrom, transformFrom, alphaFrom;
@synthesize moveTo, transformTo, alphaTo;

+ (AOTAnimate*)makeAnimationOnView:(UIView*)view_ duration:(CGFloat)duration_
{
    return [self makeAnimationOnView:view_ duration:duration_ delay:0.f];
}

+ (AOTAnimate*)makeAnimationOnView:(UIView*)view_ duration:(CGFloat)duration_ delay:(CGFloat)delay_
{
    return [[AOTAnimate alloc] initWithView:view_ duration:(CGFloat)duration_ delay:(CGFloat)delay_];
}

//----------------------------------

- (void)dealloc
{
    [view release];

    if( completeAction )
        Block_release(completeAction);

    [super dealloc];
}

- (id)initWithView:(UIView*)view_ duration:(CGFloat)duration_ delay:(CGFloat)delay_
{
    self = [super init];
    if (self)
    {
        view            = [view_ retain];
        duration        = duration_;
        delay           = delay_;

        frequency       = 0.025f;
        options         = UIViewAnimationOptionAllowUserInteraction;

        moveFrom        = view.center;
        transformFrom   = view.transform;
        alphaFrom       = view.alpha;

        moveTo          = view.center;
        transformTo     = view.transform;
        alphaTo         = view.alpha;
    }
    return self;
}

//----------------------------------
#pragma mark - Run animation

- (void)run
{
    [self runWithCompleteAction:nil];
}

- (void)runWithCompleteAction:(void (^)(void))complete_
{
    view.center    = moveFrom;
    view.transform = transformFrom;
    view.alpha     = alphaFrom;

#ifndef ANDROID

    [UIView
     animateWithDuration:duration
     delay:delay
     options:options
     animations:^(void)
     {
         view.center    = moveTo;
         view.transform = transformTo;
         view.alpha     = alphaTo;
     }
     completion:^(BOOL finished)
     {
         if( complete_ )
             complete_();
     }];

#else

    if( duration <= 0.f )
    {
        [self doAnimationComplete];
        return;
    }

    animationTicksLeft = ceil( duration / frequency );

    if( animationTicksLeft == 0 )
    {
        [self doAnimationComplete];
        return;
    }

    moveDelta   = CGPointMake( (moveTo.x-moveFrom.x)/animationTicksLeft, (moveTo.y-moveFrom.y)/animationTicksLeft );
    alphaDelta  = (alphaTo-alphaFrom)/animationTicksLeft;

    CGSize scaleFrom = CGSizeMake( [self scaleX:transformFrom], [self scaleY:transformFrom] );
    CGSize scaleTo   = CGSizeMake( [self scaleX:transformTo],   [self scaleY:transformTo]   );

    scaleDelta  = CGSizeMake((scaleTo.width - scaleFrom.width)/animationTicksLeft,
                             (scaleTo.height - scaleFrom.height)/animationTicksLeft );

    scaleCurrent = scaleFrom;

    if( complete_ )
    {
        completeAction = Block_copy(complete_);
    }

    [self performSelector:@selector(doAnimationTick) withObject:nil afterDelay:delay];

#endif
}

//----------------------------------
#pragma mark - Manual animation

#ifdef ANDROID

- (void)doAnimationTick
{
    if( CGPointEqualToPoint( moveDelta, CGPointZero ) == NO )
    {
        view.center = CGPointMake( view.center.x + moveDelta.x, view.center.y + moveDelta.y );
    }

    if( CGSizeEqualToSize( scaleDelta, CGSizeZero) == NO )
    {
        view.transform = CGAffineTransformMakeScale( scaleCurrent.width, scaleCurrent.height );
        scaleCurrent.width  += scaleDelta.width;
        scaleCurrent.height += scaleDelta.height;
    }

    if( alphaDelta != 0.f )
    {
        view.alpha = view.alpha + alphaDelta;
    }

    // - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    animationTicksLeft--;

    if( animationTicksLeft > 0 )
    {
        [self performSelector:@selector(doAnimationTick) withObject:nil afterDelay:frequency];
    }
    else
    {
        [self doAnimationComplete];
    }
}

- (void)doAnimationComplete
{
    view.center    = moveTo;
    view.transform = transformTo;
    view.alpha     = alphaTo;

    if( completeAction )
        completeAction();
}

//----------------------------------
#pragma mark - Helpers

- (CGFloat)scaleX:(CGAffineTransform)t
{
    return sqrt(t.a * t.a + t.c * t.c);
}

- (CGFloat)scaleY:(CGAffineTransform)t
{
    return sqrt(t.b * t.b + t.d * t.d);
}

#endif

@end

次のように使用します。

UIView *someview;

AOTAnimate *animate = [AOTAnimate makeAnimationOnView:someview duration:1.f delay:0.5f];

// allow to assign - animate.moveFrom / .tranfromFrom / alphaFrom properties,
// but by default they are copy from UIView* object

animate.moveTo      = CGPointMake( 100, 200 ); // new point where need to move
animate.transformTo = CGAffineTransformScale( CGAffineTransformIdentity, 1.5f, 1.5f );
animate.alphaTo     = 0.5f;

[animate runWithCompleteAction:^{
    NSLog(@"Animation done..);
}];

このメソッドが iOS デバイスで実行される場合、通常の [UIView animateWithDuration:...] メソッドが使用されます。

PS: このクラスは、ある中心点から別の中心点への「移動」のみを行います。変換は、オブジェクトをスケーリングするためだけに使用します (移動ではありません)。私の 2 台のテスト デバイスの Alpha はサポートされていませんが、一部のデバイスではサポートされている可能性があります。

于 2013-11-18T05:44:30.420 に答える
0

アニメーションは、Apportable の UIKit の現在のバージョンでは機能しません。ただし、UIKit の次のバージョンでは、完全に機能するアニメーションが提供されます。品質とカバレッジに満足したら、それをリリースします。

于 2013-11-18T03:18:11.447 に答える