123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- //
- // UINavigation+SXFixSpace.m
- // UINavigation-SXFixSpace
- //
- // Created by charles on 2017/9/8.
- // Copyright © 2017年 None. All rights reserved.
- //
- #import "UINavigation+SXFixSpace.h"
- #import "NSObject+SXRuntime.h"
- #import <UIKit/UIKit.h>
- #ifndef deviceVersion
- #define deviceVersion [[[UIDevice currentDevice] systemVersion] floatValue]
- #endif
- static BOOL sx_disableFixSpace = NO;
- @implementation UIImagePickerController (SXFixSpace)
- +(void)load {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- [self swizzleInstanceMethodWithOriginSel:@selector(viewWillAppear:)
- swizzledSel:@selector(sx_viewWillAppear:)];
-
- [self swizzleInstanceMethodWithOriginSel:@selector(viewWillDisappear:)
- swizzledSel:@selector(sx_viewWillDisappear:)];
- });
- }
- -(void)sx_viewWillAppear:(BOOL)animated {
- sx_disableFixSpace = YES;
- [self sx_viewWillAppear:animated];
- }
- -(void)sx_viewWillDisappear:(BOOL)animated{
- sx_disableFixSpace = NO;
- [self sx_viewWillDisappear:animated];
- }
- @end
- @implementation UINavigationBar (SXFixSpace)
- +(void)load {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- [self swizzleInstanceMethodWithOriginSel:@selector(layoutSubviews)
- swizzledSel:@selector(sx_layoutSubviews)];
- });
- }
- -(void)sx_layoutSubviews{
- [self sx_layoutSubviews];
- //modify by leo -fix ios13 bugs -20191008
- if (@available(iOS 13.0, *)) {
-
-
-
- }
- else {
- if (deviceVersion >= 11 && !sx_disableFixSpace) {//需要调节
- self.layoutMargins = UIEdgeInsetsZero;
- CGFloat space = sx_defaultFixSpace;
- for (UIView *subview in self.subviews) {
- if ([NSStringFromClass(subview.class) containsString:@"ContentView"]) {
- subview.layoutMargins = UIEdgeInsetsMake(0, space, 0, space);//可修正iOS11之后的偏移
- break;
- }
- }
- }
- }
-
-
- }
- @end
- @implementation UINavigationItem (SXFixSpace)
- +(void)load {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- [self swizzleInstanceMethodWithOriginSel:@selector(setLeftBarButtonItem:)
- swizzledSel:@selector(sx_setLeftBarButtonItem:)];
-
- [self swizzleInstanceMethodWithOriginSel:@selector(setLeftBarButtonItems:)
- swizzledSel:@selector(sx_setLeftBarButtonItems:)];
-
- [self swizzleInstanceMethodWithOriginSel:@selector(setRightBarButtonItem:)
- swizzledSel:@selector(sx_setRightBarButtonItem:)];
-
- [self swizzleInstanceMethodWithOriginSel:@selector(setRightBarButtonItems:)
- swizzledSel:@selector(sx_setRightBarButtonItems:)];
- });
-
- }
- -(void)sx_setLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem {
- if (deviceVersion >= 11) {
- [self sx_setLeftBarButtonItem:leftBarButtonItem];
- } else {
- if (!sx_disableFixSpace && leftBarButtonItem) {//存在按钮且需要调节
- [self setLeftBarButtonItems:@[leftBarButtonItem]];
- } else {//不存在按钮,或者不需要调节
- [self sx_setLeftBarButtonItem:leftBarButtonItem];
- }
- }
- }
- -(void)sx_setLeftBarButtonItems:(NSArray<UIBarButtonItem *> *)leftBarButtonItems {
- if (leftBarButtonItems.count) {
- NSMutableArray *items = [NSMutableArray arrayWithObject:[self fixedSpaceWithWidth:sx_defaultFixSpace-20]];//可修正iOS11之前的偏移
- [items addObjectsFromArray:leftBarButtonItems];
- [self sx_setLeftBarButtonItems:items];
- } else {
- [self sx_setLeftBarButtonItems:leftBarButtonItems];
- }
- }
- -(void)sx_setRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem{
- if (deviceVersion >= 11) {
- [self sx_setRightBarButtonItem:rightBarButtonItem];
- } else {
- if (!sx_disableFixSpace && rightBarButtonItem) {//存在按钮且需要调节
- [self setRightBarButtonItems:@[rightBarButtonItem]];
- } else {//不存在按钮,或者不需要调节
- [self sx_setRightBarButtonItem:rightBarButtonItem];
- }
- }
- }
- -(void)sx_setRightBarButtonItems:(NSArray<UIBarButtonItem *> *)rightBarButtonItems{
- if (rightBarButtonItems.count) {
- NSMutableArray *items = [NSMutableArray arrayWithObject:[self fixedSpaceWithWidth:sx_defaultFixSpace-20]];//可修正iOS11之前的偏移
- [items addObjectsFromArray:rightBarButtonItems];
- [self sx_setRightBarButtonItems:items];
- } else {
- [self sx_setRightBarButtonItems:rightBarButtonItems];
- }
- }
- -(UIBarButtonItem *)fixedSpaceWithWidth:(CGFloat)width {
- UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
- target:nil
- action:nil];
- fixedSpace.width = width;
- return fixedSpace;
- }
- @end
|