Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在更改UIView大小的同时应用动画?+ Swift 5

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
@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 12:29:55

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yourConstraint.constant = 99  // it's that easy

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

你必须先掌握它!

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

只要有一个出口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @IBOutlet var yourConstraint: NSLayoutConstraint!

并设置动画

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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

复制
相关文章
Java中常见的异常类型
类格式错误。当Java虚拟机试图从一个文件中读取Java类,而检测到该文件的内容不符合类的有效格式时抛出。
JanYork_简昀
2022/04/02
2.3K0
Java---线程多(工作内存)和内存模型(主内存)分析
转载自 https://www.cnblogs.com/chihirotan/p/6486436.html
allsmallpig
2021/02/25
2K0
JDK源码解析之 java.lang.Error
错误。是所有错误的基类,用于标识严重的程序运行问题。这些问题通常描述一些不应被应用程序捕获的反常情况。
栗筝i
2022/12/01
6280
Java-线程中的异常
给出以下例子,我想问题是线程t1运行期间抛出的异常能够被捕获吗?(这是一个相当好的问题~)
Fisherman渔夫
2020/02/19
1.5K0
cdn节点访问失败,源站测试正常,节点异常?
cdn节点测试访问异常,出现空响应,直接访问源站正常,这里看起来像是节点出现异常。
任雯霄
2020/12/30
3.8K0
java主线程捕获子线程中的异常
如果想要在主线程中捕获子线程的异常,我们需要使用ExecutorService,同时做一些修改。
Java架构师必看
2021/05/14
3K0
java主线程捕获子线程中的异常
java高级用法之:JNA中的Function
在JNA中,为了和native的function进行映射,我们可以有两种mapping方式,第一种是interface mapping,第二种是direct mapping。虽然两种方式不同,但是在具体的方法映射中,我们都需要在JAVA中定义一个和native方法进行映射的方法。
程序那些事
2022/05/17
5710
Java面试系列9
java中的保留字,现在没有在java中使用。 ✎二、必须要知道的运行时异常 ArithmeticException 是出现异常的运算条件时,抛出此异常。 例如,一个整数“除以零”时,抛出此类
Java帮帮
2018/03/19
2K0
winform 多线程中ShowDialog()步骤无效的解决办法
private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(remind); thread.IsBackground = true; thread.Start(); } private void remind() { while (true) { string h = "0"; string m = "23";
跟着阿笨一起玩NET
2018/09/19
1.3K0
Java跨语言调用,使用JNA访问Java外部接口
先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写程序时自下而上,调用时自上而下。
朝雨忆轻尘
2019/06/18
4.6K0
java高级用法之:JNA中的Structure
前面我们讲到了JNA中JAVA代码和native代码的映射,虽然可以通过TypeMapper来将JAVA中的类型和native中的类型进行映射,但是native中的数据类型都是基础类型,如果native中的数据类型是复杂的struct类型该如何进行映射呢?
程序那些事
2022/05/09
1.9K0
java高级用法之:JNA中的Structure
前面我们讲到了JNA中JAVA代码和native代码的映射,虽然可以通过TypeMapper来将JAVA中的类型和native中的类型进行映射,但是native中的数据类型都是基础类型,如果native中的数据类型是复杂的struct类型该如何进行映射呢?
程序那些事
2022/05/17
6640
java高级用法之:JNA中的Function
在JNA中,为了和native的function进行映射,我们可以有两种mapping方式,第一种是interface mapping,第二种是direct mapping。虽然两种方式不同,但是在具体的方法映射中,我们都需要在JAVA中定义一个和native方法进行映射的方法。
程序那些事
2022/05/06
1K0
java高级用法之:JNA中的回调
什么是callback呢?简单点说callback就是回调通知,当我们需要在某个方法完成之后,或者某个事件触发之后,来通知进行某些特定的任务就需要用到callback了。
程序那些事
2022/05/10
1.5K0
java中的异常总结
一般面试中java Exception(runtimeException )是必会被问到的问题
哲洛不闹
2018/09/19
1.4K0
Java多线程中的内存可见性
分为主内存和线程内存,当线程与其他线程共享一个变量时,便会把主内存的变量复制到线程内存中去。当发生对变量的修改时,会同步到主内存,主内存再同步到其他线程内存中去。
zhangheng
2020/04/28
5020
异常、线程
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/100192.html原文链接:https://javaforall.cn
全栈程序员站长
2022/06/29
7660
异常、线程
RuntimeException和Exception区别
Java设置了异常,旨在鼓励将方法中可能出现的异常告知给使用此方法的程序员(你和我!)。当然了,这种方法是比较优雅的,让我们确切的知道是在哪里出了错,并提供了异常捕获。本篇文章主要对Java中的异常进行介绍与区分。
全栈程序员站长
2022/09/15
1.1K0
RuntimeException和Exception区别
WPF中UI元素跨线程访问
dotnet中线程资源独占UI元素,不能跨线程访问,可以通过Dispatcher.Invoke的方式调用,但实际处理还是UI线程中,任务量比较大的数据会增加线程的处理压力。 其实还有一种做法,可以通过设置UI元素为只读的方式,跨线程访问。 如BitmapSource跨线程访问,可以调用Freeze设置元素为只读模式。 Aforge.net跨线程传递图像资源,如下:
sofu456
2019/07/09
1.1K0
java高级用法之:JNA中的回调
什么是callback呢?简单点说callback就是回调通知,当我们需要在某个方法完成之后,或者某个事件触发之后,来通知进行某些特定的任务就需要用到callback了。
程序那些事
2022/05/17
8950

相似问题

JNA无效内存访问

13

JNA:无效内存访问

11

JNA:无效内存访问

18

JNA中的无效内存访问

16

映射JNA中的COM接口方法无效内存访问异常

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文