• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - Objective-c 动画与尾随约束的约束不稳定问题

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:07:14 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 Objective-c 开发一个 IOS 应用程序。在为 View 的约束设置动画时,我遇到了一个不稳定的问题。动画在帧的最终位置上效果很好,但随机地,第一个动画 block 省略了尾随(右)约束(左约束永远不会达到 -20 常数值),但是前导(​​左)、顶部和底部约束正在按预期工作。

请看我上传的视频。在第一次点击中,动画按预期工作,但在第二次点击中出现问题。请指教。

Video showing the problem

- (void)animateTransitionnonnull id<UIViewControllerContextTransitioning>)transitionContext {
// 1
UIView *containerView = transitionContext.containerView;
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

// 2
[containerView addSubview:toViewController.view];

if([toViewController isKindOfClass:[ImageViewController class]]){
    ImageViewController *vcImage = (ImageViewController*)toViewController;
    vcImage.constraintLeft.constant = 20;
    vcImage.constraintTop.constant = self.selectedCardFrame.origin.y + 60.0;
    vcImage.constraintRight.constant = 20.0;
    vcImage.constraintBottom.constant = 0;//self.CollectionView.bounds.size.height - (self.selectedCardFrame.origin.y + self.selectedCardFrame.size.height);
    [toViewController.view layoutIfNeeded];

    NSTimeInterval duration = [self transitionDuration:transitionContext];
    [toViewController.view layoutIfNeeded];
    [UIView animateWithDuration:duration animations:^{
        //First animation block
        vcImage.constraintRight.constant = -20.0;
        vcImage.constraintLeft.constant = -20.0;
        vcImage.constraintTop.constant = -20.0;
        vcImage.constraintBottom.constant = 0;
        [toViewController.view layoutIfNeeded];
        //toViewController.configureRoundedCorners(shouldRound: false)
    } completion:^(BOOL finished) {
        //Second animation block
        [UIView animateWithDuration:duration animations:^{
            vcImage.constraintLeft.constant = 0;
            vcImage.constraintTop.constant = 0.0;
            vcImage.constraintRight.constant = 0;
            vcImage.constraintBottom.constant = 0;
            [toViewController.view layoutIfNeeded];
            //toViewController.configureRoundedCorners(shouldRound: false)
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:finished];
        }];
    }];
}

}

@Sh_Khan 发表评论后更新代码。

- (void)animateTransitionnonnull id<UIViewControllerContextTransitioning>)transitionContext {
// 1
UIView *containerView = transitionContext.containerView;
UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

// 2
[containerView addSubview:toViewController.view];
if([toViewController isKindOfClass:[ImageViewController class]]){
    ImageViewController *vcImage = (ImageViewController*)toViewController;
    NSTimeInterval duration = [self transitionDuration:transitionContext];

    [UIView animateWithDuration:0 animations:^{
        vcImage.constraintLeft.constant = 20;
        vcImage.constraintTop.constant = self.selectedCardFrame.origin.y + 60.0;
        vcImage.constraintRight.constant = 20.0;
        vcImage.constraintBottom.constant = 0;

        [toViewController.view layoutIfNeeded];
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:duration animations:^{
            //First animation block
            vcImage.constraintRight.constant = -20.0;
            vcImage.constraintLeft.constant = -20.0;
            vcImage.constraintTop.constant = -20.0;
            vcImage.constraintBottom.constant = 0;
            [toViewController.view layoutIfNeeded];
            //toViewController.configureRoundedCorners(shouldRound: false)
        } completion:^(BOOL finished) {
            //Second animation block
            [UIView animateWithDuration:duration animations:^{
                vcImage.constraintLeft.constant = 0;
                vcImage.constraintTop.constant = 0.0;
                vcImage.constraintRight.constant = 0;
                vcImage.constraintBottom.constant = 0;
                [toViewController.view layoutIfNeeded];
                //toViewController.configureRoundedCorners(shouldRound: false)
            } completion:^(BOOL finished) {
                [transitionContext completeTransition:finished];
            }];
        }];
    }];
}

}



Best Answer-推荐答案


在设置您的 imageView 之前,请尝试重新定位照片。有些东西告诉我 ImageView 很难确定图像的方向。我曾经在过渡期间发生过这种情况,并会解释为什么您只在某些时候看到这种行为。我对 Objective C 有点生疏,但在设置 imageView 图像之前试一试并使用它。

-(UIImage*)normalizeImageUIImage*)currentImage {
    if (currentImage.imageOrientation == UIImageOrientationUp){
        return currentImage;
    }

    UIGraphicsBeginImageContextWithOptions(currentImage.size, NO, currentImage.scale);
    [currentImage drawInRect:CGRectMake(0, 0, currentImage.size.width, currentImage.size.height)];
    UIImage *_newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return _newImage;
}

关于ios - Objective-c 动画与尾随约束的约束不稳定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50162812/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap