ios - 当用户拖动 MKMapView 时,如何为 UIImageView 设置动画?

标签 ios swift uiimageview uiviewanimation

我有一个带有图像的 UIImageView,这个图像是一个典型的 map 选择器。我把它放在 Storyboard的 map 上并分配了一些约束。

当用户在我的 map 上拖动时,该图像保持不变,我想找到一种为其设置动画的方法 - 基本上我想稍微挤压它,使其看起来像被拖动一样。

我已经有两种方法:

func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {

} 

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {

}

但我不知道如何为 UIImageView 的变化设置动画。

我尝试将以下代码添加到 regionWillChangeAnimated 中:

myPositionPicker.animate(withDuration: 1.5, delay: 0.05 * Double(index), usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
        yawpPositionPicker.transform = CGAffineTransform(translationX: 0, y: 0)
    }, completion: nil)

(其中 myPositionPicker 是我的 UIImageView),但我收到错误

Static member animate cannot be used on instance of type UIImageView

我认为对我来说最好的动画是 UIViewAnimationOptions.curveEaseIn 但我不知道如何将它附加到我的 UIImageView。你能给我一些提示吗?

最佳答案

👋

首先,您尝试在实例 myPositionPicker 上使用静态方法“animate”。这是错误的。只需更换

myPositionPicker.animate(withDuration: 1.5, delay: 0.05 * Double(index), usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
    yawpPositionPicker.transform = CGAffineTransform(translationX: 0, y: 0)
}, completion: nil)

与:

UIView.animate(withDuration: 1.5, delay: 0.05 * Double(index), usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
    // Do whatever animations you want here.
}, completion: nil)

接下来,如果你想创建一些简单的动画(比如改变 UIImageView 的位置或改变它的大小)——你可以只使用你已经创建的约束而不使用仿射变换。

例如,如果您的 ImageView 与 map View 垂直居中。首先,在您的 UIViewController 中为此约束创建一个特殊的@IBOutlet:

@IBOutlet var pickerCenterYConsraint: NSLayoutConstraint!

其次,将此导出连接到 Storyboard 中的约束。

第三,据我了解,您的 View Controller 是 map View 的委托(delegate)。所以,让我们像这样实现 map View 委托(delegate)协议(protocol):

func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
    UIView.animate(withDuration: 1.5, delay: 0.05, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
        self.pickerCenterYConsraint.constant = 25.0
        self.view.layoutIfNeeded()
    }, completion: nil)
}

func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
    UIView.animate(withDuration: 1.5, delay: 0.05, usingSpringWithDamping: 0.8, initialSpringVelocity: 0, options: [], animations: {
        self.pickerCenterYConsraint.constant = 0.0
        self.view.layoutIfNeeded()
    }, completion: nil)
}

然后...仅此而已!🤗 现在您的 ImageView 将在 map View 拖动过程中动画化。 如果您不喜欢这个解决方案 - 您可以根据约束创建自己的动画。基本上你可以做很多有限制的事情。例如,旋转除外。

关于ios - 当用户拖动 MKMapView 时,如何为 UIImageView 设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41045977/

相关文章:

ios - UIImageView 上的点击手势

ios - 容器 View 和容器 View Controller 有什么区别?

ios - 如何在不知道索引的情况下检查对象是否存在于NSMutableArray中,并在iOS中将其替换(如果存在)?

javascript - Google ReCaptcha 在 iOS 设备上验证时滚动到页面底部

swift - UILabel 未显示在 View 中

swift - Dart 的 Optional 运算符是一个枚举,类似于 Swift 的吗?

php - Swift异步数据显示卡顿

ios - 在 iOS 中将图像大小减小至最大 100 kb,并固定尺寸 512x512

ios - 对 UIImageView 从起点到终点的移动进行动画处理

ios - 将参数传递给 NSTimer 在 Swift 中调用的方法