我有4个部分,每个部分有2个嵌套行.我通过点击每个部分来打开行.

当我点击一个部分时,我希望它(chevron.right,制作为UIImageView)顺时针旋转90度,并带有平滑的动画,当我再次点击同一部分时,逆时针旋转90度.

我有一个名为isOpened的变量(bool,默认情况下为false),我将其从false更改为true,并在didSelectRowAt中每次点击后返回.基于此,显示所有嵌套单元:

   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
      if indexPath.row == 0 {
        sections[indexPath.section].isOpened = !sections[indexPath.section].isOpened
        tableView.reloadSections([indexPath.section], with: .none)
      }
   }

用同样的方法,我try 旋转V形:

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.row == 0 {
        sections[indexPath.section].isOpened = !sections[indexPath.section].isOpened
        tableView.reloadSections([indexPath.section], with: .none)
        
        guard let cell = tableView.cellForRow(at: indexPath) as? MainSortTableViewCell else { return }

        if sections[indexPath.section].isOpened {
            UIView.animate(withDuration: 1.0) {
                cell.chevronImage.transform = CGAffineTransform(rotationAngle: .pi/2)
            }
        } else {
            UIView.animate(withDuration: 1.0) {
                cell.chevronImage.transform = CGAffineTransform(rotationAngle: -.pi/2)
            }
        }
     }

但采用这种方法,我面临两个问题:

  1. 第一次点击时,它会根据需要将V形向下设置90度的动画,但当我再次点击时,它会旋转initial个V形(面向右侧),这会导致V形向上看的结果(-pi/2).如何修复该行为并将V形从其新位置旋转(从其面部向下回到初始右侧)?
  2. 当我在第一次旋转后try 点击时,动画将不会再次触发.这种转变是立竿见影的.如何解决这个问题?

下面是一个带有问题行为的GIF:CLICK

推荐答案

你误解了transform财产的含义.transform表示视图从其original位置(在本例中是面向右侧)的变换,因此将其设置为CGAffineTransform(rotationAngle: -.pi / 2)会使视图变换从其original位置旋转-.pi / 2弧度,即面朝上.

要实现所需的旋转,您可以使用视图的当前变换来实现这-.pi/2个旋转,或者只将transform设置为.identity(从其原始位置根本没有变换):

cell.chevronImage.transform = .identity
// or
cell.chevronImage.transform = cell.chevronImage.transform.rotated(by: -.pi / 2)

我怀疑你没有在cellForRowAtIndexPath中添加这个轮换代码.Please do that,没有动画.否则,在滚动表格视图(see also)后,您将遇到诸如V形重置之类的问题.然而,这意味着当你拨打reloadSections时,它会过早地被轮换.解决此问题的最简单方法是在动画后移动reloadSections:

UIView.animate(withDuration: 1.0) {
    if sections[indexPath.section].isOpened {
        cell.chevronImage.transform = CGAffineTransform(rotationAngle: .pi/2)
    } else {
        cell.chevronImage.transform = .identity
    }
} completion: {_ in
    self.tableView.reloadSections([indexPath.section], with: .none)
}

Ios相关问答推荐

更新@PersistableEnum时是否需要执行迁移块?

自定义油漆圆角三角形

IOS-获取本地化系统映像

使用 Objective-C 创建 iOS 框架

如何将 AppIntent 添加到应用程序目标并在交互式小部件中使用它

如何从单独的视图更改修饰符的值

Flutter Aging Person 自定义小部件

为什么 Swift 不在启动的同一线程上恢复异步函数?

iOS - 判断开发者模式是否开启 (Swift)

具有多个目标的应用程序的动态内容

Swift 图表:.chartYScale 似乎只适用于 100 的增量?

有哪些可靠的机制可以防止 CoreData CloudKit 中的数据重复?

通过 tuist/XcodeProj 以编程方式将文件添加到本机目标

按钮在 SwiftUI 中没有采用给定的高度和宽度

如何在保持纵横比的同时zoom UIView 的内容以适应目标矩形?

快速禁用 UITextfield 的用户输入

每次运行后,Xcode 6 都会在 iOS8 模拟器中重命名我的应用程序目录.

Xcode 4 + iOS 4.3:存档类型不存在打包程序

如何动态计算 UILabel 高度?

Objective-C 将 NSDate 设置为当前 UTC