You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旧Swift代码中CGPointMake不可用,如何按Swift规范重写对应逻辑?

解决方案

错误原因

CGPointMake 是 Objective-C 时期的遗留 API,从 Swift 3 版本开始,苹果就全面废弃了这类 C 风格的结构体构造函数,要求使用 Swift 原生带参数标签的构造语法。你当前的代码整体是 Swift 2 的写法,还有其他 API 也存在新版本不兼容的问题,一并修改即可正常运行。

适配 Swift 最新语法的完整代码

// MARK: - 横向平移手势处理方法
func handlePan(recognizer: UIPanGestureRecognizer) {
  // 1. 手势开始时记录当前视图的中心位置
  if recognizer.state == .began {
    originalCenter = center
  }
  // 2. 手势变化时跟随拖动偏移更新视图位置
  if recognizer.state == .changed {
    let translation = recognizer.translation(in: self)
    center = CGPoint(x: originalCenter.x + translation.x, y: originalCenter.y)
    // 判断用户拖动距离是否足够触发删除/完成操作
    deleteOnDragRelease = frame.origin.x < -frame.size.width / 2.0
  }
  // 3. 手势结束时处理回弹或删除逻辑
  if recognizer.state == .ended {
    // 单元格拖动前的原始位置frame
    let originalFrame = CGRect(x: 0, y: frame.origin.y,
        width: bounds.size.width, height: bounds.size.height)
    if !deleteOnDragRelease {
      // 不需要删除则动画回弹到原始位置
      UIView.animate(withDuration: 0.2, animations: {self.frame = originalFrame})
    }
  }
}

核心修改点说明

  • 修复报错核心问题:将CGPointMake(originalCenter.x + translation.x, originalCenter.y)替换为 Swift 规范的CGPoint(x: originalCenter.x + translation.x, y: originalCenter.y)
  • 枚举状态值统一改为 Swift 小写开头的规范写法:.Began改为.began、.Changed改为.changed、.Ended改为.ended
  • 替换旧版手势平移量获取方法translationInView(self)为新版translation(in: self)
  • 替换旧版动画方法animateWithDuration为新版animate(withDuration:)

内容的提问来源于stack exchange,提问作者Rocky1289

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 23:24:04