Skip to content

Instantly share code, notes, and snippets.

@Josscii Josscii/iOS-tips.md
Last active Jun 26, 2019

Embed
What would you like to do?
iOS tips

iOS Tips

记录一些 iOS 开发中的小 tip。

  1. origin 为负,子视图右下移动,origin 为正,子视图左上移动,contentOffset 同理。

  2. velocity 为正,为向左/上滑动,velocity 为负,为向右/下滑动。

  3. contentInset 会影响 contentOffset 的变化范围,top/left 影响 contentOffset 的初始值,但并不会改变 contentSize 的值。

  4. layer 的 mask 的颜色不重要,重要的是颜色的透明度,不透明,即 alpha = 1 时,则 layer 部分可以被显示出来。

  5. 常用的几个函数:abs 绝对值,floor 向下取整,ceil 向上取整,round 四舍五入,sqrt 平方根。

  6. 数组一定记得要初始化。

  7. 手势的 translationInView 是手势开始后移动的总量,而不是上一次调用到这一次调用的 delta 值,常常为了得到这个 delta 值,在获取到 translation 后调用 setTranslation:CGPointZero。

  8. 存入 NSUserDefaults 的数组时并不会记录是否是可变的,取出来的时候必须转换;存入 NSUserDefaults 里的字典中的键必须为 NSString,而值也只能为 plist 接受的值。

  9. layoutSubviews 什么时候会被调用?1. 添加或移除子视图时,2. bounds 变化时(包括 origin 和 size),3. 约束(自己和子视图的)变化时,4. 主动调用 setNeedsLayout 和 layoutIfNeeded 时。

  10. 调用 dequeueReusableCell(withIdentifier:for:) 之前需要注册 cell,且该方法一定返回可用的 cell;dequeueReusableCell(withIdentifier:) 可以不注册 cell,但是可能会返回 nil,需要自己创建 cell。

  11. 直接改变 tableHeaderView 的 frame 不会生效,必须对 tableView.tableHeaderView 重新赋值才可以。

  12. 在 iOS 中,layer 的动画在完成后默认是移除的,也就是说 layer 并不会保持动画结束的状态,这个行为可以用 isRemovedOnCompletion 来控制,默认为 true。所以排除这个影响,我们要在 false 的时候来讨论 CAAnimation 的 fillMode,fillMode 默认是 removed,也就是完成动画后回到最初的状态;forward 是完成动画后保持动画结束时的状态;backward 是在动画 delay 的过程中就设置为动画开始的状态而动画结束之后回到最初的状态;both 就是将 forward 和 backward 结合起来。

@Josscii

This comment has been minimized.

Copy link
Owner Author

Josscii commented Aug 13, 2018

  1. navigationItem 的 titleView 在 iOS 11 以下无法通过 auto layout 和子视图的约束来自动得到 size,所以最好的做法是固定一个大小,加上一个 contentView,其他的子视图添加到 contentView 上,来实现居中效果。 可以通过子视图来确定大小,系统自动居中布局,但是要注意的是,iOS 11 以下需要将 translatesAutoresizingMaskIntoConstraints 设为 false 才行。
@Josscii

This comment has been minimized.

Copy link
Owner Author

Josscii commented Aug 26, 2018

  1. 关于系统视图:
  • UILayoutContainerView 容器视图控制器的 rootView,比如 UITabBarController,UINavigationController,UIPageViewController。
  • UITransitionView/ UINavigationTransitionView 用于子视图控制器转场的视图。
  • UIViewControllerWrapperView 视图控制器的 wrapper,用于装载 vc 的所有视图。
@Josscii

This comment has been minimized.

Copy link
Owner Author

Josscii commented Aug 28, 2018

  1. oc 数组排序:
// descending 下降,ascending 上升
NSArray *sortedArray = [array sortedArrayUsingComparator: ^(id obj1, id obj2) {
    if ([obj1 integerValue] > [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedDescending;
    }
 
    if ([obj1 integerValue] < [obj2 integerValue]) {
        return (NSComparisonResult)NSOrderedAscending;
    }
    return (NSComparisonResult)NSOrderedSame;
}];
@Josscii

This comment has been minimized.

Copy link
Owner Author

Josscii commented Aug 28, 2018

  1. tableViewCell 在 willDisplayCell 里面做出现动画。
@Josscii

This comment has been minimized.

Copy link
Owner Author

Josscii commented Sep 6, 2018

  1. 永远不要尝试去 customize UISearchBar,通常在未编辑状态时,用其他控件组合来模拟,编辑状态下再用 UITextField 来代替。
@Josscii

This comment has been minimized.

Copy link
Owner Author

Josscii commented Sep 6, 2018

  1. 使用 UIVisualEffectView 的一些技巧
  • 添加子视图时,需要添加到它的 contentView 上。
  • 在 iOS 9 之后,可以给 effect 赋值来做动画。试试能不能通过将 speed 值为 0,改变 timeOffset 来控制 blur。
  • 可以通过改变 backgroundColor 来改变一些效果。
@Josscii

This comment has been minimized.

Copy link
Owner Author

Josscii commented Dec 25, 2018

  1. UITextField 除了 delegate,还有两种方式可以监听变化,一种是通知,UITextField.textDidChangeNotification 等。因为它继承自 UIControl,所以可以用 target-action 的方式来做,UIControl.Event.editingChanged 等。
@Josscii

This comment has been minimized.

Copy link
Owner Author

Josscii commented Jun 13, 2019

  1. 做卡片带阴影式 cell 时,如果用的是 9 slice 的阴影图片,那么图片的位置受到 shadowOffset 和 shadowRadius 影响,比如设计图上 x 是 20,而 shadowOffset 为 (2, 0),shadowRadius 为 10,那么实际的 x = 20 - 10 -2 = 8。依此类推。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.