UINavigation+SXFixSpace.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. //
  2. // UINavigation+SXFixSpace.m
  3. // UINavigation-SXFixSpace
  4. //
  5. // Created by charles on 2017/9/8.
  6. // Copyright © 2017年 None. All rights reserved.
  7. //
  8. #import "UINavigation+SXFixSpace.h"
  9. #import "NSObject+SXRuntime.h"
  10. #import <UIKit/UIKit.h>
  11. #ifndef deviceVersion
  12. #define deviceVersion [[[UIDevice currentDevice] systemVersion] floatValue]
  13. #endif
  14. static BOOL sx_disableFixSpace = NO;
  15. @implementation UIImagePickerController (SXFixSpace)
  16. +(void)load {
  17. static dispatch_once_t onceToken;
  18. dispatch_once(&onceToken, ^{
  19. [self swizzleInstanceMethodWithOriginSel:@selector(viewWillAppear:)
  20. swizzledSel:@selector(sx_viewWillAppear:)];
  21. [self swizzleInstanceMethodWithOriginSel:@selector(viewWillDisappear:)
  22. swizzledSel:@selector(sx_viewWillDisappear:)];
  23. });
  24. }
  25. -(void)sx_viewWillAppear:(BOOL)animated {
  26. sx_disableFixSpace = YES;
  27. [self sx_viewWillAppear:animated];
  28. }
  29. -(void)sx_viewWillDisappear:(BOOL)animated{
  30. sx_disableFixSpace = NO;
  31. [self sx_viewWillDisappear:animated];
  32. }
  33. @end
  34. @implementation UINavigationBar (SXFixSpace)
  35. +(void)load {
  36. static dispatch_once_t onceToken;
  37. dispatch_once(&onceToken, ^{
  38. [self swizzleInstanceMethodWithOriginSel:@selector(layoutSubviews)
  39. swizzledSel:@selector(sx_layoutSubviews)];
  40. });
  41. }
  42. -(void)sx_layoutSubviews{
  43. [self sx_layoutSubviews];
  44. //modify by leo -fix ios13 bugs -20191008
  45. if (@available(iOS 13.0, *)) {
  46. }
  47. else {
  48. if (deviceVersion >= 11 && !sx_disableFixSpace) {//需要调节
  49. self.layoutMargins = UIEdgeInsetsZero;
  50. CGFloat space = sx_defaultFixSpace;
  51. for (UIView *subview in self.subviews) {
  52. if ([NSStringFromClass(subview.class) containsString:@"ContentView"]) {
  53. subview.layoutMargins = UIEdgeInsetsMake(0, space, 0, space);//可修正iOS11之后的偏移
  54. break;
  55. }
  56. }
  57. }
  58. }
  59. }
  60. @end
  61. @implementation UINavigationItem (SXFixSpace)
  62. +(void)load {
  63. static dispatch_once_t onceToken;
  64. dispatch_once(&onceToken, ^{
  65. [self swizzleInstanceMethodWithOriginSel:@selector(setLeftBarButtonItem:)
  66. swizzledSel:@selector(sx_setLeftBarButtonItem:)];
  67. [self swizzleInstanceMethodWithOriginSel:@selector(setLeftBarButtonItems:)
  68. swizzledSel:@selector(sx_setLeftBarButtonItems:)];
  69. [self swizzleInstanceMethodWithOriginSel:@selector(setRightBarButtonItem:)
  70. swizzledSel:@selector(sx_setRightBarButtonItem:)];
  71. [self swizzleInstanceMethodWithOriginSel:@selector(setRightBarButtonItems:)
  72. swizzledSel:@selector(sx_setRightBarButtonItems:)];
  73. });
  74. }
  75. -(void)sx_setLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem {
  76. if (deviceVersion >= 11) {
  77. [self sx_setLeftBarButtonItem:leftBarButtonItem];
  78. } else {
  79. if (!sx_disableFixSpace && leftBarButtonItem) {//存在按钮且需要调节
  80. [self setLeftBarButtonItems:@[leftBarButtonItem]];
  81. } else {//不存在按钮,或者不需要调节
  82. [self sx_setLeftBarButtonItem:leftBarButtonItem];
  83. }
  84. }
  85. }
  86. -(void)sx_setLeftBarButtonItems:(NSArray<UIBarButtonItem *> *)leftBarButtonItems {
  87. if (leftBarButtonItems.count) {
  88. NSMutableArray *items = [NSMutableArray arrayWithObject:[self fixedSpaceWithWidth:sx_defaultFixSpace-20]];//可修正iOS11之前的偏移
  89. [items addObjectsFromArray:leftBarButtonItems];
  90. [self sx_setLeftBarButtonItems:items];
  91. } else {
  92. [self sx_setLeftBarButtonItems:leftBarButtonItems];
  93. }
  94. }
  95. -(void)sx_setRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem{
  96. if (deviceVersion >= 11) {
  97. [self sx_setRightBarButtonItem:rightBarButtonItem];
  98. } else {
  99. if (!sx_disableFixSpace && rightBarButtonItem) {//存在按钮且需要调节
  100. [self setRightBarButtonItems:@[rightBarButtonItem]];
  101. } else {//不存在按钮,或者不需要调节
  102. [self sx_setRightBarButtonItem:rightBarButtonItem];
  103. }
  104. }
  105. }
  106. -(void)sx_setRightBarButtonItems:(NSArray<UIBarButtonItem *> *)rightBarButtonItems{
  107. if (rightBarButtonItems.count) {
  108. NSMutableArray *items = [NSMutableArray arrayWithObject:[self fixedSpaceWithWidth:sx_defaultFixSpace-20]];//可修正iOS11之前的偏移
  109. [items addObjectsFromArray:rightBarButtonItems];
  110. [self sx_setRightBarButtonItems:items];
  111. } else {
  112. [self sx_setRightBarButtonItems:rightBarButtonItems];
  113. }
  114. }
  115. -(UIBarButtonItem *)fixedSpaceWithWidth:(CGFloat)width {
  116. UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
  117. target:nil
  118. action:nil];
  119. fixedSpace.width = width;
  120. return fixedSpace;
  121. }
  122. @end