
[code]

    [UIView animateWithDuration:0 
                          delay:0
                        options:UIViewAnimationOptionCurveEaseIn
                         animations:^{
      　      self.view.transform=CGAffineTransformMakeTranslation(0, 0);}
    completion:^ 
    {
    }];
    
[/code]

上記のアニメーションの書き方は途中で止めるのに向いていないことは分かりました。

ストーリーボードを使っていて `UIControlEventTouchDown` の `sender` です

[code]

    - (IBAction)botan:(UIButton *)sender {
        CGRect frame = self.viewname.frame;
        frame.origin.x += 5;
        [self.viewname setFrame:frame];
    }
    
[/code]

これを、ボタンが押されている限り繰り返させるのはどうしたらいいんでしょうか  
繰り返せたとして滑らかではないと思うのですがどうしたら滑らかに動かせるんでしょうか

ド初心者なので触って覚えていこうと思っています  
宜しくお願いします


CC BY-SA 3.0
2015-03-06T15:45:31.807
7562
2015-03-07T03:33:02.907
2015-03-06T16:42:51.607
49
8725
question
objective-c iphone xcode6 storyboard uikit
ボタンを押しているときにimage viewをちょっとずつ動かすアニメーションについて


例えば、タイマーで繰り返し処理するならこんな感じじゃないでしょうか。

[code]

    #import "ViewController.h"
    
    @interface ViewController ()
    
    @property (weak, nonatomic) IBOutlet UIView *viewname;
    @property (strong, nonatomic) NSTimer *timer;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
    
      [super viewDidLoad];
    }
    
    - (IBAction)didTouchDownButton:(id)sender { // Touch Down に結びつけ
    
      self.timer = [NSTimer scheduledTimerWithTimeInterval: 0.01f // スピードは繰り返し間隔であるこの値で調節
                     target: self
                     selector: @selector(translateViewName:)
                     userInfo: nil
                     repeats: YES];
    }
    
    - (IBAction)didTouchUpOrCancel:(id)sender { // Touch Cancel, Touch Up Inside, Touch Up Outside に結びつけ
    
      [self.timer invalidate]; // タイマーを止める
      self.timer = nil;
    }
    
    - (void)translateViewName:(NSTimer *)timer {
    
      CGRect frame = self.viewname.frame;
      frame.origin.x += 1.0f; // 視認上、最小単位である1ポイント以下の移動なら滑らかに見えるはず
      [self.viewname setFrame: frame];
    }
    
    @end
    
[/code]

ほか、例えば長押しの検出などは UILongPressGesuture を使う、繰り返し実行には UIScreen の -
displayLinkWithTarget:selector: を使う、などが考えられると思います。また、CALayer
の暗黙的/明示的なアニメーションとモデル層/プレゼンテーション層の違いなども学習すると、また異なった方法を利用できるかもしれません。


CC BY-SA 3.0
2015-03-07T01:52:04.150
7570
2015-03-07T01:52:04.150
7562
answer


アニメーションといわれて、まず思い浮かぶのが、UIViewの「animation〜」で始まるメソッド群と、CAAnimationフレームワークですが、これらは、画面遷移のときに、ビューを左右上下にスライドさせるとか、オブジェクトをタップしたら、すこし震えてみせるとか、ユーザ操作に反応していることを示す、視覚効果で使うことを意図したもので、せいぜい1秒以下のアニメーションが、前提になっています。  
iOS
7より、UIDynamicsという、よりおおがかりなアニメーションを、UIViewサブクラスに与えるフレームワークが追加されました。これはCPUでなくGPU（Graphic
Proccessing Unit）を使うので、マシンの負担が小さいわりに、スムーズなアニメーションを実現できます。

[code]

    #import "ViewController.h"
    
    @interface ViewController ()
    
    // アニメーションの対象のイメージビュー、imageView
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    // UIViewにアニメーション機能を追加するクラス、UIDynamicAnimator
    @property (nonatomic) UIDynamicAnimator *animator;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // ViewControllerのベースビューに、アニメーションを組みこむ。
        self.animator = [[UIDynamicAnimator alloc] initWithReferenceView: self.view];
    }
    
    // 画面上の任意の場所をタップ。
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        // 「ふるまい」を定義するクラスを生成。このふるまいに従うアイテム（UIViewサブクラス）を配列（NSArray）で登録。
        UIDynamicItemBehavior *moveBehavior = [[UIDynamicItemBehavior alloc] initWithItems: @[self.imageView]];
        // 直線運動という「ふるまい」を定義。方向とスピード、動かすアイテムを指定。
        [moveBehavior addLinearVelocity: CGPointMake(0.0, 50.0) forItem: self.imageView];
        // アニメーション開始。
        [self.animator addBehavior: moveBehavior];
    }
    
    // タップした指を、画面から離す。
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
        // アニメーションの終了。
        [self.animator removeAllBehaviors];
    }
    
    @end
    
[/code]

タップにより、断続的にimageViewが移動することを、確認してください。  
UIDynamicsは、ほかに円運動もできますし、重力によってビューが落下することも実現できます。すこし勉強をする必要がありますが、それに振り向けた労力以上の効果を得ることができるはずです。


CC BY-SA 3.0
2015-03-07T03:33:02.907
7574
2015-03-07T03:33:02.907
7362
7562
answer