相关疑难解决方法(0)

使用自动布局时如何从一个UIView到另一个UIView进行翻转动画?

我总是习惯使用以下代码在一个视图和另一个视图之间制作翻转动画:

        [UIView transitionFromView:firstView
                        toView:secondView
                      duration:0.6
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    completion:^(BOOL finished) {
                        // finish code here
                    }];
Run Code Online (Sandbox Code Playgroud)

这很好用,给人一种自然的翻转.

但是当我在使用自动布局的故事板上定义的视图上使用它时,事情开始变得混乱 - 视图在此动画之后被调整大小并移动.

有没有办法通过设置约束动画来制作这种翻转动画?

animation flip uikit ios autolayout

8
推荐指数
1
解决办法
4842
查看次数

处理UIKeyboardWillShowNotification以便在按下视图控制器时键盘已经启动?

通常,如果您将UITextField设置为第一响应者,viewDidLoad或者viewWillAppear当视图控制器被推入导航堆栈时,您将获得一个动画,其中视图控制器从右侧滑入,键盘已经向上(即没有双动画) :

在此输入图像描述
理想的动画(250毫秒)

但是,当我使用自动布局并根据键盘大小控制视图的布局时,会导致奇怪的动画.在这种情况下,我的按钮有一个约束到superview的底部,我在键盘通知事件中更新其常量属性.

在此输入图像描述
越野车动画(250毫秒)

(注意按钮,占位符和标签在推送期间如何向上动画.还要注意光标如何从占位符文本下方开始并向上浮动直到它到达占位符.)

根本问题似乎是,当通知被触发时,它已经在动画块(动画导航控制器的动画块)中,然后在现有动画块中触发另一个动画块(即,self.view.layoutIfNeeded()以便自动布局更改动画).

当然我可以在viewDidAppear中调用becomeFirstResponder ,但后来我得到了两个动画.我想利用键盘已启动的行为,因此界面看起来更具响应性(理想情况下保持接近250毫秒).

在此输入图像描述
双动画(600毫秒)

我如何处理UIKeyboardWillShowNotification,以便当用户点击UITextField并且在推动视图控制器时使用我上面的理想动画时它将同时工作?


理想解决方案

  • Apple会在通知字典中提供另一个值,例如shouldAnimate,它会告诉您在处理通知时是否应该使用UIAnimation块.例如:在此推送的情况下,它会发送false,但如果用户只是点击文本字段,它将发送true.

Hacky的解决方法:

  • 不要立即在viewDidLoad中设置becomeFirstReponder,而是以任意延迟调用它.这将导致不合需要的双重动画:首先视图控制器将从右侧滑入,然后键盘将出现.(有关此示例,请参阅上面的"双动画"动画.)
  • 推断如果你是在一个动画块通过查看通知的用户信息字典的关键,比如UIKeyboardAnimationDurationUserInfoKey这是0.35一个推动过程,并且0.25当用户点击一个的UITextField.如果定制动画,Apple更改动画等,这很容易破坏.
  • viewWillAppear(preventAnimationBlock = true)和viewDidAppear(preventAnimationBlock = false)中设置一个标志.这似乎是最安全的方法,并产生我想要的精确动画.但是,维持状态是不可取的.

解决方案不起作用:

  • viewDidLoad中的布局.以现在的眼光最后还是没负载,通话setNeedsLayoutlayoutIfNeeded,而该解决方案在过去的工作,它不与上面的按钮例子工作.这将导致标签和文本视图无法正确设置动画,但该按钮仍将无法正确显示动画.
  • 尝试检查你是否已经处于动画块中:如果有办法知道我是否已经在动画块中,它可以解决我的问题; layoutIfNeeded在那种情况下我根本不会打电话.我尝试使用其中一种方法来解决这个问题,但没有一种方法可行.可能是因为这是Apple在内部使用的某种隐藏/魔术动画块.
  • 尝试查看视图是否在屏幕上:使用此视图的想法是视图将在屏幕外报告,因为尚未调用viewDidAppear,因此我不会将代码包装在动画块中.但是,当您尝试 …

keyboard cocoa-touch nsnotificationcenter ios autolayout

7
推荐指数
0
解决办法
747
查看次数

UIView animateWithDuration太快了

我曾经习惯于UIView animateWithDuration增加shapeLayer.frame.size.height下面的代码,但无论持续时间如何,都会非常快.我发现的一些帖子推荐使用了我已经完成的一些延迟时间,但它仍然很快动画,忽略了我设置的5秒持续时间.

private let minimalHeight: CGFloat = 50.0  
private let shapeLayer = CAShapeLayer()

override func loadView() {  
super.loadView()

shapeLayer.frame = CGRect(x: 0.0, y: 0.0, width: view.bounds.width, height: minimalHeight)
shapeLayer.backgroundColor = UIColor(red: 57/255.0, green: 67/255.0, blue: 89/255.0, alpha: 1.0).CGColor
view.layer.addSublayer(shapeLayer)

  }

func delay(delay:Double, closure:()->()) {
    dispatch_after(
        dispatch_time(
            DISPATCH_TIME_NOW,
            Int64(delay * Double(NSEC_PER_SEC))
        ),
        dispatch_get_main_queue(), closure)
}


override func viewDidAppear(animated: Bool) {
   delay(3)    {

    UIView.animateWithDuration(5.0) {
        self.shapeLayer.frame.size.height += 400.0
        }
    }
Run Code Online (Sandbox Code Playgroud)

如何在5秒内完成动画制作?

uiview ios animatewithduration swift swift2

7
推荐指数
1
解决办法
1817
查看次数

Swift 动画 UITableViewCell 扩展高度约束

我有一个带有静态单元格的 TableView,当按下按钮时,我想在其中展开。单元格内有一个容器视图,已正确设置约束,但我不确定如何实际为单元格扩展设置动画,因为它需要我刷新表视图以更新约束并扩展单元格。

目前,当我调用expandContainerView它时没有动画,因为我正在调用self.tableView.reloadData.

这是我用来扩展单元格的代码

@objc private func expandContainerView(notification: NSNotification) {

    self.view.layoutIfNeeded()

    UIView.animate(withDuration: 2.0, delay: 0.0, options: .curveEaseOut, animations: {
        self.containerHeightConstraint.constant = 410
        self.view.layoutIfNeeded()
        self.tableView.reloadData()
    }, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

这是我在索引代码处每行的高度

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    return UITableViewAutomaticDimension
}
Run Code Online (Sandbox Code Playgroud)

animation constraints tableview ios swift

5
推荐指数
2
解决办法
7491
查看次数

砌体animationWithDuration没有动画

我试图从我的viewController顶部底部动画UIWebView,我正在使用砌体(https://github.com/Masonry/Masonry).

我最初创建了我的webview,其大小为0 - (x,y,height和width),然后我尝试对其进行动画处理,以便webview为viewcontroller的"on top"设置动画.显示了webview,但它没有动画到位 - 它只是立即出现.任何有经验的人都可以指导我朝着正确的方向前进吗?

这是我的按钮动作

-(void)didPressBtn{
    self.infoView = [UIWebView new];
    self.infoView.scalesPageToFit = YES;
    self.infoView.backgroundColor = [UIColor whiteColor];
    self.infoView.delegate = self;
    [self.scrollView addSubview:self.infoView];
    [self.infoView makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(@(0));
    }];


    [self.scrollView layoutIfNeeded];
    //FIXME: Hmmm it doesn't really animate!?
    [UIView animateWithDuration:1 animations:^{
        [self.scrollView setContentOffset:CGPointMake(0, 0)];
        [self.infoView makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(self.scrollView);
        }];

        [self.scrollView layoutIfNeeded];

    } completion:^(BOOL finished) {
                [self.infoView loadRequest:[[NSURLRequest alloc] initWithURL:[[NSURL alloc] initWithString:NSLocalizedString(@"INFORMATION_URL", )] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:15]];
    }];
}
Run Code Online (Sandbox Code Playgroud)

我的viewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scrollView = [UIScrollView new]; …
Run Code Online (Sandbox Code Playgroud)

animation objective-c ios autolayout masonry-ios-osx

3
推荐指数
1
解决办法
4959
查看次数

如果调用layoutIfNeeded(),UIView 约束将不会动画

我正在尝试对一个被约束 ( iconVerticalConstraint) 位于+100超级视图中心 Y ( ) 的视图进行动画处理,特别是0在动画后到达其右侧 ( ) 位置。这是我的代码:

self.view.layoutIfNeeded()

UIView.animateKeyframes(withDuration: 2, delay: 0, animations: {

    UIView.addKeyframe(withRelativeStartTime: 0.0, relativeDuration: 0.25, animations:{
        self.iconVerticalConstraint.constant -= 20
    })

    UIView.addKeyframe(withRelativeStartTime: 0.25, relativeDuration: 0.75, animations:{
        self.iconVerticalConstraint.constant -= 80
    })
})
Run Code Online (Sandbox Code Playgroud)

我尝试遵循这个问题的答案,但这没有帮助,因为在我的情况下,我的视图包含更多子视图,本质上链接,并且放入layoutIfNeeded()我的动画块将使整个视图动画化,而不仅仅是那个约束。否则这种方法根本不会产生动画。

cocoa animation uiview ios swift

0
推荐指数
1
解决办法
3642
查看次数

如何创建像 iOS 共享表菜单一样的短模式叠加?

我正在尝试创建一个自定义的短菜单,从屏幕底部向上滑动并停留在底部(如 iOS 共享表)。我很难弄清楚如何去做。我尝试将视图控制器呈现为模态并设置首选内容大小,但它仍将其呈现为全屏。我怎样才能呈现一个简短的、类似模态的叠加层?

objective-c ios swift

-1
推荐指数
1
解决办法
1491
查看次数