IOS; Как масштабировать UIimageView (навсегда), а затем переместить его - PullRequest
2 голосов
/ 30 марта 2012

Я ударил стену здесь.Я знаю, как переместить изображение с помощью «CGAffineTransformMakeTranslation», и я также знаю, как масштабировать изображение с помощью «CGAffineTransformMakeScale», но, судя по всему, я не могу заставить одно изображение выполнять оба этих действия и оставаться в этом состоянии.Он масштабируется до желаемого размера в течение доли секунды, а затем сразу возвращается к исходному размеру и перемещается в нужное место.Мне нужно, чтобы изображение стало большим, ОСТАЛОСЬ большим, а затем переместилось в новое место (при этом оставаясь без изменений в своем новом размере).

Вот что происходит в моем файле .m:

-(IBAction)PushZoomButton {

[UIWindow animateWithDuration:1.5
                 animations:^{
                     JustinFrame.transform = CGAffineTransformMakeScale(2.0, 2.0);
                     JustinFrame.transform = CGAffineTransformMakeTranslation(10.0, 10.0);}];



[UIWindow commitAnimations];}

Любая помощь с этим будет оценена!

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Второе преобразование, которое вы установили, переопределяет первое. Вам нужно объединить оба действия в одно, как сказал Луис. Другой способ написания этого будет:

CGAffineTransform transform = CGAffineTransformMakeScale(2.0, 2.0);
transform = CGAffineTransformTranslate(transform, 10, 10);
JustinFrame.transform = transform;
2 голосов
/ 30 марта 2012

вы можете использовать CGAffineTransformConcat, например:

JustinFrame.transform = CGAffineTransformConcat(CGAffineTransformMakeScale(2.0, 2.0), CGAffineTransformMakeTranslation(10.0, 10.0));

Возможно, вам придется адаптировать перевод к (5, 5), поскольку вы удвоили шкалу

0 голосов
/ 30 марта 2012

Вам может понадобиться заглянуть в CoreAnimation, в основном то, что анимация UIView контролирует под капотом.Если вы настроите CAAnimation, то, чего вы хотите добиться, это сделать с помощью свойства fillMode анимации.

Вот несколько примеров кода, чтобы UIView выглядело так, как будто оно открывается как дверь (копия вставила некоторый код, который яесть, но, возможно, вы могли бы изменить его и найти его полезным):

- (void) pageOpenView:(UIView *)viewToOpen duration:(NSTimeInterval)duration pageTurnDirection:(PageTurnDirection) p{
// Remove existing animations before stating new animation
[viewToOpen.layer removeAllAnimations];

// Make sure view is visible
viewToOpen.hidden = NO;

// disable the view so it’s not doing anythign while animating
viewToOpen.userInteractionEnabled = NO;

float dir = p == 0 ? -1.0f : 1.0f;  // for direction calculations

// create an animation to hold the page turning
CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
transformAnimation.removedOnCompletion = NO;
transformAnimation.duration = duration;
transformAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

CATransform3D startTransform = CATransform3DIdentity;

if (p == NEXT_PAGE) {
    // orig values
    startTransform.m34 = 0.001f;
}else {
    // orig values
    startTransform.m34 = -0.001f;
}

// start the animation from the current state
transformAnimation.fromValue = [NSValue valueWithCATransform3D:startTransform];
// this is the basic rotation by 90 degree along the y-axis
CATransform3D endTransform = CATransform3DMakeRotation(3.141f/2.0f,
                                                       0.0f,
                                                       dir,
                                                       0.0f);
// these values control the 3D projection outlook

if (p == NEXT_PAGE) {
    endTransform.m34 = 0.001f;
    endTransform.m14 = -0.0015f;
}else {
    endTransform.m34 = -0.001f;  
    endTransform.m14 = 0.0015f;
}


transformAnimation.toValue = [NSValue valueWithCATransform3D:endTransform];


// Create an animation group to hold the rotation
CAAnimationGroup *theGroup = [CAAnimationGroup animation];

// Set self as the delegate to receive notification when the animation finishes
theGroup.delegate = self;
theGroup.duration = duration;
// CAAnimation-objects support arbitrary Key-Value pairs, we add the UIView tag
// to identify the animation later when it finishes
[theGroup setValue:[NSNumber numberWithInt:[(BODBookPageView *)viewToOpen pageNum]] forKey:@"animateViewPageNum"];  //STEPHEN: We set the tag to the page number
[theGroup setValue:[NSNumber numberWithInt: p] forKey:@"PageTurnDirection"]; 
[theGroup setValue:[NSNumber numberWithBool:YES] forKey:@"isAnimationMidpoint"];  // i.e. is this the first half of page-turning or not?

// Here you could add other animations to the array
theGroup.animations = [NSArray arrayWithObjects:transformAnimation,  nil];
theGroup.removedOnCompletion = NO;  // THIS LINE AND THE LINE BELOW WERE CRUCIAL TO GET RID OF A VERY HARD TO FIND/FIX BUG.
theGroup.fillMode = kCAFillModeForwards;  //  THIS MEANS THE ANIMATION LAYER WILL STAY IN THE STATE THE ANIMATION ENDED IN, THEREBY PREVENTING THAT ONE FRAME FLICKER BUG.
// Add the animation group to the layer
[viewToOpen.layer addAnimation:theGroup forKey:@"flipViewOpen"];

}

...