自己碰到的一些问题

把平时工作中碰到的一些问题和解决办法写出来,共勉

  • - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;方法在调用的之前,设置ScrollView的ContentSize一定不能为0,否则该方法将不起作用(而setContentOffSet依然可用)
  • 若只需要使用一次的图片,不要使用UIImage imageNamed的方式去获取,因为imageNamed会自动把加载过的图片资源在内存缓存,如果下次在调用同名称的文件,是直接从内存中获得,所以正确的获取方式是使用绝对路径的方式获取图片,如:[NSString stringWithFormat:@“%@/%@”,[[NSBundle mainBundle] bundlePath],imageNamed] 然后调用使用[UIImage imageWithContentsOfFile]
  • UITextView中其实上下左右分别有8个像素的单位的空白,文字不会在这个区域内显示,所以使用计算高度的方法- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context 或sizeWithFont时,需要将TextView的宽度减去16个像素(左右),而设置TextView的高度时,再加上16像素,即可完整显示
  • 若创建了一个ViewController,在push之前首先调用Controller.View的方法或属性,就会提前触发Controller的ViewDidLoad方法,这种情况下如果Controller的父类提前调用了NaviationController等操作是失效的,因为此时还没有执行Push的操作,NavigationController为空
  • 限定UIPanGestureRecognizer的方向:使用- (CGPoint)velocityInView:(nullable UIView *)view; 获取其偏移量,.x值如果大于0则代表是向右滑动,此时再判断手势滑动,而小于0则代表向左滑动(若不进行限定,则任何方向滑动都会触发NavigationController的上一个视图的viewwillAppear方法,如果在ViewWillAppear方法中进行了请求,则会造成多次请求,造成浪费和损失性能)
  • iTunesConnect中如果配置文件失效了,点击编辑虽然可以使配置文件状态变为可用,但是依然再上传过程中会报错(ITMS 90034),需要重新申请配置文件
  • 如果你确定你的APP中没有调用私有API(ValueForKey的字符串是不算的),仍然出现构建版本无效,请查看第三方类库中是否包含Reveal.Framework,这个库会包含一个名为UICreateCGImageFromIOSurface的私有方法,造成提包的验证失败,需要移除后才可以提交审核
  • 单个页面设置导航栏的64高度自动偏移automaticallyAdjustsScrollViewInsets,也可以在导航栏页面设置navigationController.navigationBar.translucent来设置自动偏移
  • // animator and behaviors
  • @property (nonatomic, strong) UIDynamicAnimator *animator;
  • @property (nonatomic, strong) UICollisionBehavior *collision;
  • @property (nonatomic, strong) UIDynamicItemBehavior *itemBehavior;
  • @property (nonatomic, strong) UITapGestureRecognizer *tapOnStart;
  • //以上效果可以实现聚合效果和下拉刷新效果
  • KVO-这个KVO很邪乎,需要额外注意的是如果要将被观察的类removefromsuperview或者dealloc的时候,一定要先移除观察者再执行remove或者dealloc的操作!否则会报runtime层面的的错误(即断点无法检测到错误)
  • 苹果官方建议使用iMovie软件去录制App的视频预览,文档地址:https://developer.apple.com/app-store/app-previews/imovie/Creating-App-Previews-with-iMovie.pdf
  • 企业账户申请Appid的时候不能和公司账户申请的Appid相同,因此企业账户可以额外安装一个完全相同的App
  • 如果WebView在Push中底部出现黑条,只需要将WebView的opaque属性设置为No即可,由于iOS需要节省GPU的性能,所以这个Opaque属性实际上是表示是否开启或关闭图层上下之间的颜色混合开关,当opaque属性被设为YES时,GPU就不会再利用图层颜色合成公式去合成其覆盖在一起色调并显示而当opaque属性设置为YES时,上方的图层就会和下方的图层交叉部分进行色调混合以便实现更高的交叉透明效果,但是这样会损耗较大的GPU性能。所以如果WebView中出现黑条,是因为Push进来的WebView首先和其下方的图层进行交叉绘制,但是由于下方Tabbar实际上是被隐藏而并非是设置了Opaque属性为No,所以会被交叉绘制,从而形成黑色条。注意:如果opaque被设置成YES,而对应UIView的alpha属性不为1.0的时候,就会有不可预料的情况发生
  • CAAnimation的FillMode含义:FillMode决定了动画效果在非执行时间段,比如动画开始之前和动画执行之后,在这个CAAnimation动画执行的时候需要将其removedOnCompletion设置为NO,否则FillMode不起作用,几个FillMode的枚举值含义如下:

1.kCAFillModeRemoved,这个是默认值,也就是说当动画开始前和结束后,动画对Layer都没有影响,动画结束后,layer会恢复到原来的状态

2.kCAFillModeForwards,当动画结束后,layer不会恢复到原来的状态,会一直保持最后的状态

3.kCAFillModeBackwards,这个和kCAFillModeForwards相对,,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态 

4.kCAFillModeBoth,这个是kCAFillModeForwards和kCAFillModeBackwards两者的结合,当动画开始执行之前,layer就立即处于动画的初始状态,而动画结束后,会保持最后的状态


猜你喜欢

转载自blog.csdn.net/u013583789/article/details/50771636