Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 以编程方式使用约束设置UIImageView(视图)从点A到点B的动画_Ios_Uiimageview_Uiviewanimation_Nslayoutconstraint - Fatal编程技术网

Ios 以编程方式使用约束设置UIImageView(视图)从点A到点B的动画

Ios 以编程方式使用约束设置UIImageView(视图)从点A到点B的动画,ios,uiimageview,uiviewanimation,nslayoutconstraint,Ios,Uiimageview,Uiviewanimation,Nslayoutconstraint,我有一个图像视图,我已经在屏幕的右中对齐了。添加带有约束的图像视图本身时,一切正常。我需要设置从原始位置(点A)到屏幕底部(点B)的图像视图的动画;问题是,当我尝试从点A到点B设置动画时,图像视图从屏幕的左上角开始,就像它只是在没有约束的情况下添加的一样(与我希望从中心开始的位置相反) 以下是代码和一些注释: #define DEGREES_TO_RADIANS(x) (M_PI * x / 180.0) //defined above - (void)viewDidLoad { UIImage

我有一个图像视图,我已经在屏幕的右中对齐了。添加带有约束的图像视图本身时,一切正常。我需要设置从原始位置(点A)到屏幕底部(点B)的图像视图的动画;问题是,当我尝试从点A到点B设置动画时,图像视图从屏幕的左上角开始,就像它只是在没有约束的情况下添加的一样(与我希望从中心开始的位置相反)

以下是代码和一些注释:

#define DEGREES_TO_RADIANS(x) (M_PI * x / 180.0) //defined above
- (void)viewDidLoad
{
UIImage *cardFaceDownImage = [UIImage imageNamed:@"b-top@2x.png"];
UIImageView *dealCardDown = [[UIImageView alloc] initWithImage:cardFaceDownImage];
dealCardDown.translatesAutoresizingMaskIntoConstraints = NO;

NSLayoutConstraint *dealCardConstraintY = [NSLayoutConstraint constraintWithItem:dealCardDown attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:1];

NSLayoutConstraint *dealCardConstraintX = [NSLayoutConstraint constraintWithItem:dealCardDown attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:130];

[self.view addConstraint:dealCardConstraintY];
[self.view addConstraint:dealCardConstraintX];
[self.view addSubview:dealCardDown];

//IF I comment out the below code the UIImageView lines up where I want it (Point A)
//IF I don't coment it out, the imageview starts in the upper left hand corner of the screen
//where it normally would as if just adding an image view programatically without
//constraints would, but it does end up where I want it to (Point B)

[self.view removeConstraint:dealCardConstraintX];
[self.view removeConstraint:dealCardConstraintY];

dealCardConstraintY = [NSLayoutConstraint constraintWithItem:dealCardDown attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1 constant:1];

dealCardConstraintX = [NSLayoutConstraint constraintWithItem:dealCardDown attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1 constant:130];

[self.view addConstraint:dealCardConstraintY];
[self.view addConstraint:dealCardConstraintX];

[self.view setNeedsUpdateConstraints];

[UIView animateWithDuration:2.0 delay:2.0 options:UIViewAnimationCurveEaseIn animations:^(void)
 {
     dealCardDown.transform = CGAffineTransformRotate(dealCardDown.transform, DEGREES_TO_RADIANS(90));

     [self.view layoutIfNeeded];

 }
 completion:^(BOOL finished)
 { 
 }
 ];
 }

..

您需要将约束的更改移动到动画块中,以便正确设置动画。 这个代码对我很有用

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];

UIView *dealCardDown = [[UIView alloc] initWithFrame:(CGRect){0,0,50,50}];
dealCardDown.backgroundColor = [UIColor redColor];
dealCardDown.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *sizeConstraint = [NSLayoutConstraint constraintWithItem: dealCardDown attribute: NSLayoutAttributeWidth relatedBy: NSLayoutRelationEqual toItem: nil attribute:NSLayoutAttributeNotAnAttribute multiplier: 1 constant: 50];
[dealCardDown addConstraint:sizeConstraint];
sizeConstraint = [NSLayoutConstraint constraintWithItem: dealCardDown attribute: NSLayoutAttributeHeight relatedBy: NSLayoutRelationEqual toItem: nil attribute:NSLayoutAttributeNotAnAttribute multiplier: 1 constant: 50];
[dealCardDown addConstraint:sizeConstraint];
[self.view addSubview:dealCardDown];

NSLayoutConstraint *dealCardConstraintX = [NSLayoutConstraint constraintWithItem:dealCardDown attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f];
NSLayoutConstraint *dealCardConstraintY = [NSLayoutConstraint constraintWithItem:dealCardDown attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.f constant:-self.view.center.y+dealCardDown.frame.size.height/2];


[self.view addConstraint:dealCardConstraintX];
[self.view addConstraint:dealCardConstraintY];
[self.view layoutIfNeeded];

[UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^(void)
 {
     dealCardDown.transform = CGAffineTransformRotate(dealCardDown.transform, 90*M_PI/180);
     dealCardConstraintY.constant = 0;
     [self.view layoutIfNeeded];

 }
                 completion:^(BOOL finished)
 { 
 }
 ];
}

我只是复制并粘贴了这段代码。它为我做的只是在屏幕的右侧放一个小的(50,50)红色视图。CGAffineTransformRotate可以工作(正如我的代码中所做的那样),我可能应该将其从示例中删除,但我需要视图从屏幕的中心移动到底部。谢谢你!谢谢你的帮助,等等。它实际上是把它推到右边,然后制作动画。我会按照你想要的方式调整它。给我一秒钟:)它不会立即开始动画,因为您的代码示例中有2.0延迟。它也有这种奇怪的定位,因为在您的示例中,中心偏移量为130。我更新了代码示例,使其从中间移动到底部。享受:)总结一下。它在viewDidLoad中不起作用,因为在应用自动布局之前调用了此方法。要使其工作,您需要将代码移动到生命周期中进一步执行的某个方法,例如-(void)viewDidAppear:(BOOL)animated