旧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
相关产品推荐
相关产品推荐

