8036


拡大表示されている画像の値がおかしいです。  
画像の拡大には`CABasicAnimation`を使用しています。（詳細は下記にコードを記しています）  
拡大後の画像で色々とピンチインさせたりボタンタップのイベントを拾ったりしようとしたのですが、何も反応してくれません。試しに画像の大きさのログを取ってみると、拡大前と拡大後で同じ値となっていました。これはどういうことなのでしょうか？正しく拡大できていないのでしょうか？  
実際`ImageView`に`ScrollView`を乗せて、`ScrollView`の背景に色を付けて動作させたところ、`ImageView`が拡大した後に`ImageView`が緑色で覆われました。ということは拡大はできているのでしょうか？しかし値はおかしなままです。どなたか分かる方がいれば教えていただきたいです。すみませんが、よろしくお願いします。

ViewController.h

[code]

    @interface ViewController : UIViewController<UIScrollViewDelegate>
    
    @property (weak, nonatomic) IBOutlet UIImageView *imageButtonView;
    @property (weak, nonatomic) IBOutlet UIImageView *cancelButton;
    
    @end
    
[/code]

ViewController.m

[code]

    @interface ViewController () {
        UIScrollView *scrollView;
    }
    
    @end
    
    @implementation ViewController
    
    bool isImageMax = false;
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        _imageButtonView.tag = 100;
        _imageButtonView.userInteractionEnabled = YES;
        _imageButtonView.multipleTouchEnabled = YES;
        _imageButtonView.image = [UIImage imageNamed:@"coupon.png"];
        NSLog(@"%f: %f", _imageButtonView.bounds.size.width, _imageButtonView.bounds.size.height);
    
        _cancelButton.tag = 200;
        _cancelButton.userInteractionEnabled = YES;
        _cancelButton.hidden = YES;
    
        scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
        scrollView.delegate = self;
        scrollView.minimumZoomScale = 1.0;
        scrollView.maximumZoomScale = 2.0;
        [_imageButtonView addSubview:scrollView];
    }
    
    - (void)didReceiveMemoryWarning {
    
        [super didReceiveMemoryWarning];
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    {
        UITouch *touch = [[event allTouches] anyObject];
    
        if (touch.view.tag == _imageButtonView.tag) {
            self.view.backgroundColor = [UIColor blackColor];
            _imageButtonView.userInteractionEnabled = NO;
    
            [self imageMoveAndScale:1.0 scaleTo:2.0 moveFrom:_imageButtonView.layer.position moveTo:CGPointMake(self.view.center.x, self.view.center.y) duration:0.5];
    
        } else if (touch.view.tag == _cancelButton.tag) {
    
            [self imageMoveAndScale:2.0 scaleTo:1.0 moveFrom:CGPointMake(self.view.center.x, self.view.center.y) moveTo:_imageButtonView.layer.position duration:0];
        }
    }
    
    - (void)imageMoveAndScale:(float)scaleFrom scaleTo:(float)scaleTo moveFrom:(CGPoint)moveFrom moveTo:(CGPoint)moveTo duration:(float)duration {
        CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
        scaleAnimation.fromValue = [NSNumber numberWithFloat:scaleFrom];
        scaleAnimation.toValue = [NSNumber numberWithFloat:scaleTo];
    
        CABasicAnimation *moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
        moveAnimation.duration = duration;
        moveAnimation.repeatCount = 1;
        moveAnimation.fromValue = [NSValue valueWithCGPoint:moveFrom];
        moveAnimation.toValue = [NSValue valueWithCGPoint:moveTo];
    
        CAAnimationGroup *group = [CAAnimationGroup animation];
        group.duration = duration;
        group.repeatCount = 1;
        group.delegate = self;
        group.removedOnCompletion = NO;
        group.fillMode = kCAFillModeForwards;
        group.animations = [NSArray arrayWithObjects:scaleAnimation, moveAnimation, nil];
        [_imageButtonView.layer addAnimation:group forKey:@"move-scale-layer"];
    }
    
    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
        return _imageButtonView;
    }
    
    
    - (CGFloat)distanceWithPointA:(CGPoint)pointA pointB:(CGPoint)pointB
    {
        CGFloat dx = fabs( pointB.x - pointA.x );
        CGFloat dy = fabs( pointB.y - pointA.y );
        return sqrt(dx * dx + dy * dy);
    }
    
    - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
        if (isImageMax) {
            self.view.backgroundColor = [UIColor whiteColor];
            _cancelButton.hidden = YES;
            _imageButtonView.userInteractionEnabled = YES;
            isImageMax = false;
    
            scrollView.frame = CGRectMake(0, 0, 0, 0);
    
        } else {
            _cancelButton.hidden = NO;
            isImageMax = true;
    
            scrollView.frame = CGRectMake(_imageButtonView.center.x, _imageButtonView.center.y, _imageButtonView.bounds.size.width, _imageButtonView.bounds.size.height);
        }
    }
    
    @end
    
[/code]


CC BY-SA 3.0
2015-03-17T07:34:46.623
8011
2015-03-17T23:19:49.570
2015-03-17T08:02:05.153
5210
5210
question
objective-c cabasicanimation
拡大された画像の値がおかしい


ご提示のコードを読ませていただきましたが、正直なにをなさっているのか理解できませんでした。UIScrollViewは、なにをやってるんですか？

ピンチイン、アウトをハンドリングするのは、UIGestureRecognizerのサブクラスUIPinchGestureRecognizerを使います。以下がサンプルコードです。（ViewController.hは、追加コードがないので、省略しています）

[code]

    #import "ViewController.h"
    
    @interface ViewController ()
    
    // imageViewを、拡大、縮小する。
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // UIPinchGestureRecognizerの組み込み。
        UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget: self action: @selector(pinchGesture:)];
        [self.view addGestureRecognizer: pinchGestureRecognizer];
    }
    
    - (void)pinchGesture: (UIPinchGestureRecognizer *)gesture {
        // プロパティstateで、ピンチ開始、ピンチ中、ピンチ終了を判別。
        if (gesture.state == UIGestureRecognizerStateBegan) {
            // プロパティvelocity（速度）は、ピンチインで負、ピンチアウトで正の値になる。ピンチインで、imageViewのサイズを80.0に、ピンチアウトで160.0にする。
            CGFloat length = (gesture.velocity >= 0) ? 160.0 : 80.0;
            // アニメーション処理。
            [UIView animateWithDuration: 0.5 delay: 0.0 usingSpringWithDamping: 0.4 initialSpringVelocity: 0.8 options: UIViewAnimationOptionCurveEaseIn animations: ^{
                CGRect viewRect = self.imageView.frame;
                self.imageView.frame = CGRectMake(viewRect.origin.x + (viewRect.size.width - length) / 2.0, viewRect.origin.y + (viewRect.size.height - length) / 2.0, length, length);
            } completion: NULL];
        }
    }
    
    @end
    
[/code]

今回は、アニメーション処理に、UIViewクラスのメソッドanimateWithDuration:〜を採用しました。これはSpring with
Damping、擬態語で表現すると「ボヨヨン」を表現するのが目的です。

UIGestureRecognizerには、UIPanGestureRecognizerというサブクラスもあり、これと連動することで、ViewをPan（タッチの移動）に追従して移動することが可能になります。


CC BY-SA 3.0
2015-03-17T23:19:49.570
8036
2015-03-17T23:19:49.570
7362
8011
answer