首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在更改UIView大小的同时应用动画?+ Swift 5

如何在更改UIView大小的同时应用动画?+ Swift 5
EN

Stack Overflow用户
提问于 2020-06-24 20:19:09
回答 1查看 286关注 0票数 0

我是IOS开发的新手,我在UIView中有两个按钮,当用户选择portraitlandscape选项时,更改UIView重新调整大小并更改背景颜色,我需要为该过程添加动画。作为示例:用户选择portrait,然后用户可以看到红色UIVIew。单击landscape选项后,动画应该开始,它看起来像,红色图像出现在前面,更改landscape模式的大小(更改高度和宽度),并转到上一个位置并将颜色更改为绿色。我已经在代码中添加了小的UIView动画,它有助于你确定我们应该在哪里开始和结束动画。如果有人知道如何正确,请让我知道并感谢您的帮助。请参考下面的代码

代码语言:javascript
运行
复制
import UIKit

class ViewController: UIViewController {
    
    let portraitWidth : CGFloat = 400
    let portraitHeight : CGFloat = 500
    
    let landscapeWidth : CGFloat = 700
    let landscapeHeight : CGFloat = 400
    
    var mainView: UIView!
    var mainStackView: UIStackView!
    
    let segment: UISegmentedControl = {
        let segementControl = UISegmentedControl()
        return segementControl
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.translatesAutoresizingMaskIntoConstraints = false
        
        mainStackView = UIStackView()
        mainStackView.axis = .vertical
        mainStackView.translatesAutoresizingMaskIntoConstraints = false
        mainStackView.alignment = .center
        mainStackView.distribution = .equalCentering
        self.view.addSubview(mainStackView)
        
        self.segment.insertSegment(withTitle: "Portrait", at: 0, animated: false)
        self.segment.insertSegment(withTitle: "Landscape", at: 1, animated: false)
        self.segment.selectedSegmentIndex = 0
        self.segment.addTarget(self, action: #selector(changeOrientation(_:)), for: .valueChanged)
        self.segment.translatesAutoresizingMaskIntoConstraints = false
        self.segment.selectedSegmentIndex = 0
        mainStackView.addArrangedSubview(self.segment)
        
        let safeAreaLayoutGuide = self.view.safeAreaLayoutGuide
        NSLayoutConstraint.activate([
            self.mainStackView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor, constant: 20),
            self.mainStackView.centerXAnchor.constraint(equalTo: safeAreaLayoutGuide.centerXAnchor, constant: 0),
        ])
        
        NSLayoutConstraint.activate([
            self.segment.heightAnchor.constraint(equalToConstant: 35),
            self.segment.widthAnchor.constraint(equalToConstant: 300)
        ])
        
        mainView = UIView(frame: .zero)
        mainView.translatesAutoresizingMaskIntoConstraints = false
        mainStackView.addArrangedSubview(mainView)
        mainView.backgroundColor = UIColor.red
        NSLayoutConstraint.activate([
            mainView.heightAnchor.constraint(equalToConstant: portraitHeight),
            mainView.widthAnchor.constraint(equalToConstant: portraitWidth),
            mainView.topAnchor.constraint(equalTo: segment.bottomAnchor, constant: 30)
        ])
        
    }
    
    @IBAction func changeOrientation(_ sender: UISegmentedControl) {
        self.mainView.constraints.forEach{ (constraint) in
            self.mainView.removeConstraint(constraint)
        }
        UIView.animate(withDuration: 1.0) {
            if (sender.selectedSegmentIndex == 0) {
                self.mainView.backgroundColor = UIColor.red
                NSLayoutConstraint.activate([
                    self.mainView.heightAnchor.constraint(equalToConstant: self.portraitHeight),
                    self.mainView.widthAnchor.constraint(equalToConstant: self.portraitWidth),
                    self.mainView.topAnchor.constraint(equalTo: self.segment.bottomAnchor, constant: 30)
                ])
            } else {
                self.mainView.backgroundColor = UIColor.green
                NSLayoutConstraint.activate([
                    self.mainView.heightAnchor.constraint(equalToConstant: self.landscapeHeight),
                    self.mainView.widthAnchor.constraint(equalToConstant: self.landscapeWidth),
                    self.mainView.topAnchor.constraint(equalTo: self.segment.bottomAnchor, constant: 30)
                ])
            }
        }
    }
    
    
}

更新的逻辑

代码语言:javascript
运行
复制
@IBAction func changeOrientation(_ sender: UISegmentedControl) {
    UIView.animate(withDuration: 4.0) {
        if (sender.selectedSegmentIndex == 0) {
            self.mainView.backgroundColor = UIColor.red
            self.widthConstraint.constant = self.portraitWidth
            self.heightConstraint.constant = self.portraitWidth
        } else {
            self.mainView.backgroundColor = UIColor.green
            self.widthConstraint.constant = self.landscapeWidth
            self.heightConstraint.constant = self.landscapeHeight
        }
        self.mainView.layoutIfNeeded()
    } }
EN

回答 1

Stack Overflow用户

发布于 2020-06-24 20:29:55

这是可能的,基本的问题是:

·无法对一个约束和另一个约束之间的实际更改进行动画处理。

要更改大小或形状,只需设置约束长度的动画。

当你在学习的时候,我真心地建议你简单地将约束动画化。

因此,不要试图“更改”约束,只需动画一个或另一个的长度。

代码语言:javascript
运行
复制
yourConstraint.constant = 99  // it's that easy

我也真心敦促你在storyboard上把它放在上。

你必须先掌握它!

而且堆栈视图也没有任何理由,现在就把它去掉。

只要有一个出口

代码语言:javascript
运行
复制
 @IBOutlet var yourConstraint: NSLayoutConstraint!

并设置动画

代码语言:javascript
运行
复制
    UIView.animateWithDuration(4.0) {
        self.yourConstraint.constant = 666
        self.view.layoutIfNeeded()
    }

一定要在Stack Overflow中搜索"iOS动画约束“,因为有很多东西需要学习。

  • 在故事板上做这件事,这么简单的事情最多需要20秒。一旦您掌握了故事板,只有在有某种原因的情况下才能继续编写代码

  • 忽略堆栈视图

  • 只需对约束的常量进行动画处理,即可更改大小、形状或任何您喜欢的内容。

  • 一定要在谷歌上找到许多很棒的文章“在iOS中设置约束动画”,在这里和其他网站上都可以!
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62554870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档