首页 游戏任务 正文

大家都在问的200513问题,答案看这一篇就够了!

各位老铁,今天这日子口,200513,看着就是一串数字,但对我来说,这可有得说道说道。不是啥大事儿,就是我自个儿瞎折腾的一点记录,分享给大家伙儿乐呵乐呵,也算是个存档。

起因:翻出了个老古董

话说,我这人有个毛病,就是喜欢囤东西,尤其是电子产品和一些没完成的小项目。前几天收拾屋子,从一个积灰的硬盘里翻出来一个老早以前的App源码。那还是我刚学iOS开发那会儿,大概是……瞅瞅日期,好像就是围绕着一个叫啥“iOS_Engine_4.4.24_200513_01”的版本鼓捣出来的东西。当时觉得特牛,现在一看,嗨,简直不忍直视。

大家都在问的200513问题,答案看这一篇就够了!

这App,功能也简单,就是个图片加滤镜的小玩意儿,当时做了一半,因为有个屏幕旋转的bug死活搞不定,加上后来忙别的,就给撂下了。看到那个“200513”的字样,一下子勾起了我的回忆。

动手:试图拯救一下

就是有点强迫症,看见没完成的东西就手痒。心想,当年搞不定的问题,现在我经验也多了点,能不能给它救回来?说干就干!

大家都在问的200513问题,答案看这一篇就够了!

第一步,环境搭建。我的天,这可费老劲了。现在的Xcode版本早就不知道更新到哪儿去了,那老代码一编译,满江红!各种报错,看得我头都大了。折腾了小半天,降级Xcode,找旧的SDK,好不容易才让它能勉强跑起来。

第二步,定位bug。 就是那个屏幕旋转的问题。当时记得是,一横屏,好家伙,界面元素全飞了,或者直接闪退。我先是按照当年的思路,去检查生命周期方法,看看是不是 `viewWillTransitionToSize` 这类的方法没处理瞅了半天,逻辑上好像也没啥大毛病。

大家都在问的200513问题,答案看这一篇就够了!

第三步,查资料。 我就寻思,那个“200513_01”的引擎版本,会不会有什么已知的坑?上网搜了搜,信息不多,毕竟太老了。但隐约记得,那时候有些引擎对AutoLayout和手动计算frame混合使用的时候,旋转处理特别容易出问题。我这老代码里,可不就是混着用的嘛

过程:一波三折

接下来就是漫长的调试了。

  • 我尝试着把手动计算frame的部分,改成纯AutoLayout试试。改动量那叫一个大,几乎等于重写了那部分的UI。改完一运行,旋转是不闪退了,但是元素的位置还是不对,歪七扭八的。
  • 然后我又想,是不是那个引擎版本本身对旋转的优化就有问题?我试着在旋转前后加各种log,看看各个视图的frame,bounds都是啥情况。发现旋转之后,有些视图的坐标系好像就乱了套。
  • 没办法,我又把代码回滚,想着能不能在它原有的手动计算frame的逻辑上,针对旋转做一些“暴力”校正。就是旋转前记录下各个元素相对位置,旋转后再强行给它掰回来。这种方法糙是糙了点,但有时候还真管用。

就这么折腾了两三天,每天下班回来就对着这堆老代码死磕。中间好几次都想放弃了。心想,一个破玩意儿,至于吗?但转念一想,这不就是跟自己较劲嘛当年没搞定的,现在凭啥还搞不定?

结果:柳暗花明,又有点哭笑不得

怎么着?说来也巧。在我几乎要放弃,准备把代码打包再塞回硬盘的角落时,无意中看到一行被注释掉的代码。那是我当年随手加的一行,用来强制设定某个容器视图在旋转时的transform属性的。当时可能觉得没用,或者有冲突,就给注释了。

我抱着死马当活马医的心态,把那行注释取消了,重新编译,运行……你猜怎么着?成了!屏幕旋转流畅得不行,元素位置也基本都对了,就那么一丁点儿小瑕疵,稍微调了调约束优先级就完美了。

我当时就愣那儿了,哭笑不得。 搞了半天,原来关键的一步当年我自己给毙了!这感觉,就像你找钥匙找了半天,发现钥匙就在自个儿兜里揣着。

这“200513”对我来说,不单单是个版本号,更像是个提醒。提醒我有时候解决问题的关键,可能就在不经意间被忽略的细节里。也算是给我这几天的瞎折腾画上了一个还算圆满的句号。虽然这App现在看来也没啥用了,但这个过程,挺有意思的。

行了,今天就叨叨这么多,各位晚安!

本文转载自互联网,如有侵权,联系删除

相关推荐