【问题标题】:Unable to minimize subview alongside mainView during animation动画期间无法在主视图旁边最小化子视图
【发布时间】:2017-09-05 10:45:51
【问题描述】:

我有两个view,videoView(mainView)和subVideoView(mainView的subView)。

我正在尝试同时使用动画最小化两个视图,如下面的代码所示。我能够最小化 videoView(即 mainView)而不是 subVideoView。

但是,当我隐藏用于最小化 videoView(即 mainView)的代码时,我能够最小化 subVideoView。

我认为这与我制作动画的方式有关。

有人可以请教我如何用动画同时最小化两个视图(按比例)并最终得到以下结果。

现有代码的结果

func minimiseOrMaximiseViews(animationType: String){


        UIView.animate(withDuration: 0.5, delay: 0, options: [],

            animations: { [unowned self] in  
                switch animationType {
                case "minimiseView" :

                    // Minimising subVideoView

                    self.subVideoView.frame =   CGRect(x:       self.mainScreenWidth - self.minSubVideoViewWidth - self.padding,
                                                       y:       self.mainScreenHeight - self.minSubVideoViewHeight - self.padding,
                                                       width:   self.minSubVideoViewWidth,
                                                       height:  self.minSubVideoViewHeight)

                    // Minimising self i.e videoView

                    self.frame = CGRect(x:      self.mainScreenWidth - self.videoViewWidth - self.padding,
                                        y:      self.mainScreenHeight - self.videoViewHeight - self.padding,
                                        width:  self.videoViewWidth,
                                        height: self.videoViewHeight)

                    self.layoutIfNeeded()

                case "maximiseView":

                    // Maximising videoView

                    self.frame = CGRect(x: 0, y: 0, width: self.mainScreenSize.width, height: self.mainScreenSize.height)

                    // Maximising subVideoView

                    self.subVideoView.frame =   CGRect(x:       self.mainScreenWidth - self.maxSubVideoViewWidth - self.padding,
                                                       y:       self.mainScreenHeight - self.maxSubVideoViewHeight - self.padding - self.buttonStackViewBottomPadding - buttonStackViewHeight,
                                                       width:   self.maxSubVideoViewWidth,
                                                       height:  self.maxSubVideoViewHeight) 
                default:
                    break
}

【问题讨论】:

    标签: ios swift uiview uiviewanimation uianimation


    【解决方案1】:

    根据您的要求在 ma​​inView 中添加 subViews 并设置

    mainView.clipsToBounds = true
    

    而在minimiseOrMaximiseViews 方法中,您只需要管理ma​​inViewY 轴即可进行显示和隐藏。

    【讨论】:

    • 我想最小化视图,即减小视图大小。我不想 clipsToBounds 因为它只是剪辑并且不会减小视图大小。
    • @moritz,添加了详细图片以更好地解释问题
    【解决方案2】:

    当我将两个视图(videoView 和 subVideoView)都设置为窗口的子视图即UIApplication.shared.keywindow 时,我可以使用动画同时最小化这两个视图。

    【讨论】:

      【解决方案3】:

      除非我遗漏了什么,否则这种动画更容易通过为videoView(主视图)的transform 属性设置动画来实现。您需要为此连接缩放和平移变换,因为缩放默认应用于视图的中心。

      诀窍是对视图应用变换会自动影响其所有子视图,例如对视图应用缩放变换会同时缩放视图及其所有子视图。

      要制作反向动画,只需在动画块内设置videoView.transform = CGAffineTransformIdentity

      警告:不过,您应该小心转换视图的frame 属性。 frame 属性是合成的,派生自 boundscentertransform。这意味着设置视图的frame 会重置其transform 属性。换句话说,如果您使用transform 操作视图,您很可能希望避免直接设置它们的框架。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        相关资源
        最近更新 更多