【问题标题】:How to transform multiple view to same location(CGPoint)如何将多个视图转换到同一位置(CGPoint)
【发布时间】:2020-02-17 10:02:47
【问题描述】:

我有多个UIImageViews,分布在一个视图中。

@IBOutlet var leftIVs: [UIImageView]!
@IBOutlet var topIVs: [UIImageView]!
@IBOutlet var rightIVs: [UIImageView]!

我正在尝试使用UIView.animate... 函数和'transform' 属性创建一个函数,它将所有这些UIImageViews 带到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

图像未显示在中心。我怎样才能做到这一点?提前致谢!

【问题讨论】:

  • 当前行为是什么?
  • 基本上它们会向中心移动一点,但不会在中心堆积。左侧边缘附近的图像堆叠在中心的左侧。同样,右侧的那个堆叠在靠近中心顶部的位置。

标签: ios swift uiviewanimation cgpoint


【解决方案1】:

我认为您的问题是您没有减小图像视图的大小,以便它们堆叠在屏幕的确切中心。

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)
}

【讨论】:

  • 你的代码给了我和我一样的结果。
  • 那段代码在我这边工作得很好,你能添加一个你得到的结果的可视化表示吗?
  • 现在工作正常。只需执行viewDidAppear 中的代码,而不是viewWillAppear。它仍然看起来很奇怪。
【解决方案2】:

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 }
}

【讨论】:

  • 例如,如果 OP 使用自动布局,这是不可能的。
  • 如果我想在一段时间后将这些 UIImageView 带到它们的原始位置怎么办?我不认为这对此有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 2013-04-04
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多