Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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 如何将多个视图转换到同一位置(CGPoint)_Ios_Swift_Uiviewanimation_Cgpoint - Fatal编程技术网

Ios 如何将多个视图转换到同一位置(CGPoint)

Ios 如何将多个视图转换到同一位置(CGPoint),ios,swift,uiviewanimation,cgpoint,Ios,Swift,Uiviewanimation,Cgpoint,我有多个UIImageViews,分布在一个视图中 @IBOutlet var leftIVs: [UIImageView]! @IBOutlet var topIVs: [UIImageView]! @IBOutlet var rightIVs: [UIImageView]! 我正在尝试使用UIView.animate…函数和“transform”属性创建一个函数,它将所有这些UIImageViews置于superview的中心。我正在使用以下代码: let performInitialTr

我有多个
UIImageView
s,分布在一个视图中

@IBOutlet var leftIVs: [UIImageView]!
@IBOutlet var topIVs: [UIImageView]!
@IBOutlet var rightIVs: [UIImageView]!
我正在尝试使用
UIView.animate…
函数和“transform”属性创建一个函数,它将所有这些
UIImageView
s置于
superview
的中心。我正在使用以下代码:

let performInitialTransformation: ((UIImageView)->()) = { (card) in
    let cardCenter = CGPoint(x: card.frame.midX, y: card.frame.midY)
    let viewCenter = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.midY)
    let deltaPoint = cardCenter - viewCenter //also tried (viewCenter - cardCenter)
    UIView.animate(withDuration: 0.5, animations: {
        card.transform = CGAffineTransform.init(translationX: deltaPoint.x, y: deltaPoint.y)
    }) { (done) in 
    }
}

for card in topIVs {
    performInitialTransformation(card)
}

for card in leftIVs {
    performInitialTransformation(card)
}

for card in rightIVs {
    performInitialTransformation(card)
}
我正在使用这个静态函数:

extension CGPoint {
    static func -(lhs: CGPoint, rhs: CGPoint) -> CGPoint {
        return CGPoint(x: rhs.x - lhs.x, y: rhs.y - lhs.y)
    }
}
注意:另外,我将在之后将这些图像恢复到原始位置,我将使用
CGAffineTransform.identity


图像没有显示在中间。我怎样才能做到这一点?提前谢谢

要使用什么
center

UIView.animate(withDuration: 0.5) {
    images.forEach { $0.center = superview.center }
}
完整的例子

var subviewes = [UIView]()
var view = UIView(frame: CGRect.init(x: 0, y: 0, width: 30, height: 30))
view.backgroundColor = .yellow
subviewes.append(view)

view = UIView(frame: CGRect.init(x: 0, y: 0, width: 20, height: 20))
view.backgroundColor = .green
subviewes.append(view)

view = UIView(frame: CGRect.init(x: 0, y: 0, width: 10, height: 10))
view.backgroundColor = .red
subviewes.append(view)

subviewes.forEach { self.view.addSubview($0) }

UIView.animate(withDuration: 0.5) {
    subviewes.forEach { $0.center = self.view.center }
}

我认为你的问题在于你没有缩小图像视图的大小,使它们堆叠在屏幕的正中央

let deltaX = (self.view.center.x - card.frame.minX) - card.frame.width/2
let deltaY = (self.view.center.y - card.frame.minY) - card.frame.height/2
UIView.animate(withDuration: 1) {
    card.transform = .init(translationX: deltaX, y: deltaY)
}

当前的行为是什么?基本上,它们会向中心移动一点,但不会堆积在中心。靠近左边缘的图像堆叠在中心的左侧。类似地,右边的一个堆栈靠近中心顶部。如果OP使用自动布局,这是不可能的。如果我想在一段时间后将这些UIImageView恢复到原始位置,该怎么办?我不认为这会有帮助。你的代码给我的结果与我的代码相同。该代码在我这方面工作得非常好,你能为你得到的结果添加一个可视化表示吗?现在工作得很好。只需在
viewdide
中执行代码,而不是
viewwillbeen
。这似乎仍然是奇怪的行为。