Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何正确设置高度约束的动画_Ios_Swift_Animation_Constraints - Fatal编程技术网

Ios 如何正确设置高度约束的动画

Ios 如何正确设置高度约束的动画,ios,swift,animation,constraints,Ios,Swift,Animation,Constraints,在我的应用程序中,我正在为视图的高度约束设置动画,当高度约束更改时,视图会向下平移一段时间,尽管我将约束设置为0。以下是我用来设置更改动画的代码: UIView.animate(withDuration: 0.5) { if finalHeight >= mediumY { self.heightConstraintConstant = self.maxHeight } else { self.heightConstraintConstant

在我的应用程序中,我正在为视图的高度约束设置动画,当高度约束更改时,视图会向下平移一段时间,尽管我将约束设置为0。以下是我用来设置更改动画的代码:

UIView.animate(withDuration: 0.5) {
    if finalHeight >= mediumY {
        self.heightConstraintConstant = self.maxHeight
    } else {
        self.heightConstraintConstant = self.minHeight
    }
}
以下是创建所有可展开视图的方法:

    //
//  ExpandibleView.swift
//  PhotoMapping
//
//  Created by Lorenzo Santini on 04/09/18.
//  Copyright © 2018 Lorenzo Santini. All rights reserved.
//

import Foundation
import UIKit

class ExpandableView: UIView {
    let panGestureRecognizer = UIPanGestureRecognizer()

    var minHeight: CGFloat = 0 {
        didSet {
            initialHeight = minHeight
        }
    }
    var maxHeight: CGFloat = 0

    var initialHeight: CGFloat = 0
    var initialPoint: CGPoint? = nil

    var heightConstraintConstant: CGFloat {
        get {
            if !self.constraints.filter({ $0.firstAttribute == .height}).isEmpty {
                return self.constraints.filter({$0.firstAttribute == .height && $0.secondItem == nil}).first!.constant
            } else {
                let constrain = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: initialHeight)
                constrain.priority = .defaultHigh
                self.addConstraint(constrain)
                return constrain.constant
            }
        }

        set(newConstant){
            if !self.constraints.filter({ $0.firstAttribute == .height}).isEmpty {
                self.constraints.filter({$0.firstAttribute == .height && $0.secondItem == nil}).first?.constant = newConstant
            } else {
                let constrain = NSLayoutConstraint(item: self, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .height, multiplier: 1.0, constant: newConstant)
                self.addConstraint(constrain)
            }
            //self.layoutIfNeeded()
        }

    }

    func initialize(minHeight: CGFloat, maxHeight: CGFloat) {
        //Create panGestureRecognizer
        panGestureRecognizer.addTarget(self, action: #selector(handlePan(_:)))
        panGestureRecognizer.minimumNumberOfTouches = 1
        panGestureRecognizer.maximumNumberOfTouches = 1
        self.addGestureRecognizer(panGestureRecognizer)

        //Set min and max height
        self.minHeight = minHeight
        self.maxHeight = maxHeight

        self.translatesAutoresizingMaskIntoConstraints = false

        self.subviews.map{$0.translatesAutoresizingMaskIntoConstraints = false}
    }

    @objc func handlePan(_ sender: Any) {
        let translation = panGestureRecognizer.translation(in: self)

        if initialPoint == nil {
            initialPoint = translation
        }

        let translationHeight = CGFloat(translation.y - initialPoint!.y)
        let finalHeight = translationHeight + initialHeight

        if panGestureRecognizer.state == .changed {
            if finalHeight <= maxHeight && finalHeight >= minHeight {
                heightConstraintConstant = finalHeight
            } else if finalHeight >= maxHeight {
                heightConstraintConstant = maxHeight
            } else if finalHeight <= minHeight {
                heightConstraintConstant = minHeight
            }
        } else if panGestureRecognizer.state == .ended {

            let mediumY = maxHeight / 2 + minHeight / 2

            if finalHeight >= mediumY {
                self.heightConstraintConstant = self.maxHeight
            } else {
                self.heightConstraintConstant = self.minHeight
            }
            UIView.animate(withDuration: 0.5) {
                self.layoutIfNeeded()
            }

            initialPoint = nil
            initialHeight = heightConstraintConstant
        }

        //layoutIfNeeded()
    }

}
//
//斯威夫特
//照相
//
//洛伦佐·桑蒂尼于2018年9月4日创作。
//版权所有©2018洛伦佐·桑蒂尼。版权所有。
//
进口基金会
导入UIKit
类ExpandableView:UIView{
设panGestureRecognizer=UIPanGestureRecognizer()
var minHeight:CGFloat=0{
迪塞特{
初始高度=最小高度
}
}
var maxHeight:CGFloat=0
变量initialHeight:CGFloat=0
变量初始点:CGPoint?=nil
var heightConstraintConstant:CGFloat{
得到{
if!self.constraints.filter({$0.firstAttribute==.height}).isEmpty{
返回self.constraints.filter({$0.firstAttribute=.height&&$0.secondItem==nil})。first!.constant
}否则{
let constraint=NSLayoutConstraint(项:self,属性:。高度,relatedBy:。相等,toItem:nil,属性:。高度,乘数:1.0,常数:initialHeight)
constraint.priority=.defaultHigh
self.addConstraint(约束)
返回常数
}
}
设置(新常量){
if!self.constraints.filter({$0.firstAttribute==.height}).isEmpty{
self.constraints.filter({$0.firstAttribute=.height&&$0.secondItem==nil})。first?.constant=newConstant
}否则{
let constraint=NSLayoutConstraint(项:self,属性:。高度,relatedBy:。相等,toItem:nil,属性:。高度,乘数:1.0,常数:newConstant)
self.addConstraint(约束)
}
//self.layoutifneed()
}
}
func初始化(最小高度:CGFloat,最大高度:CGFloat){
//创建搜索识别器
PangestureRecognitor.addTarget(self,action:#选择器(handlePan(:))
PangestureRecognitor.MinimumNumberOfTouchs=1
PangestureRecognitor.MaximumNumberOfTouchs=1
self.addgestureignizer(pangestureignizer)
//设置最小和最大高度
self.minHeight=最小高度
self.maxHeight=maxHeight
self.translatesAutoResizengMaskintoConstraints=false
self.subviews.map{$0.translatesAutoresizingMaskIntoConstraints=false}
}
@objc func手柄(uu发送方:任何){
let translation=pangestrerecognizer.translation(in:self)
如果initialPoint==nil{
初始点=翻译
}
让translationHeight=CGFloat(translation.y-initialPoint!.y)
让最终高度=平移高度+初始高度
如果panGestureRecognizer.state==.changed{
如果最终高度=最小高度{
heightConstraintConstant=最终高度
}否则,如果最终高度>=最大高度{
heightConstraintConstant=最大高度
}否则,如果最终重量=中等{
self.heightConstraintConstant=self.maxHeight
}否则{
self.heightConstraintConstant=self.minHeight
}
UIView.animate(持续时间:0.5){
self.layoutifneed()
}
初始点=零
初始高度=高度约束常数
}
//layoutIfNeeded()
}
}
对我来说,问题不在于如何设置高度变化的动画,因为这是可行的,而在于解决一个事实,即在一段时间内,应用程序似乎忽略了顶部的约束。

我相信您需要做的是为正在更新的布局设置动画。更具体地说是这样的

if finalHeight >= mediumY {
    self.heightConstraintConstant = self.maxHeight
} else {
    self.heightConstraintConstant = self.minHeight
}
UIView.animate(withDuration: 0.5) {
    viewThatTheConstraintBelongsTo.layoutIfNeeded()
}

我相信你需要做的实际上是动画的布局正在更新。更具体地说是这样的

if finalHeight >= mediumY {
    self.heightConstraintConstant = self.maxHeight
} else {
    self.heightConstraintConstant = self.minHeight
}
UIView.animate(withDuration: 0.5) {
    viewThatTheConstraintBelongsTo.layoutIfNeeded()
}

但这不是设置约束更改动画的方法。的可能重复。我从未做过类似的事情…我该怎么做?可能重复@RakeshaShastri我没有找到设置约束更改动画的解释,但这不是设置约束更改动画的方法。的可能重复。我从未做过类似的事情…我该怎么做do?可能的@RakeshaShastri副本我没有找到对约束更改设置动画的解释
视图,即约束项belongsto
将是
超级视图
视图,约束项belongsto
将是
超级视图。