美文网首页
iOS 调整导航栏按钮与边框的距离

iOS 调整导航栏按钮与边框的距离

作者: 大成小栈 | 来源:发表于2020-09-10 10:33 被阅读0次

    废话少说,直接上干货!👇

    1. 一个设置按钮相对于navBar约束的类

    .h文件

    #import <UIKit/UIKit.h>
    
    typedef NS_ENUM(NSInteger, MANavBarBtnPosition) {
        MANavBarBtn_Left,
        MANavBarBtn_Right
    };
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface MANavBarBtnView : UIView
    
    @property (nonatomic, assign) MANavBarBtnPosition position;
    
    + (void)setupNavBarBtnWithNavItem:(UINavigationItem *)navItem view:(UIView *)view position:(MANavBarBtnPosition)position;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    .m 文件

    #import "MANavBarBtnView.h"
    
    #define Margin  10.0
    
    @interface MANavBarBtnView () {
        BOOL applied;
    }
    
    @end
    
    @implementation MANavBarBtnView
    
    - (void)layoutSubviews {
        [super layoutSubviews];
        
        if (applied || [[[UIDevice currentDevice] systemVersion] doubleValue] < 11.0) {
            return;
        }
        
        UIView *view = self;
        while (![view isKindOfClass:[UINavigationBar class]] && [view superview] != nil) {
            view = [view superview];
            if ([view isKindOfClass:[UIStackView class]] && [view superview] != nil) {
                if (self.position == MANavBarBtn_Left) {
                    [view.superview addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view.superview attribute:NSLayoutAttributeLeading multiplier:1.0 constant:Margin]];
                    applied = YES;
                }
                else if (self.position == MANavBarBtn_Right) {
                    [view.superview addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:view.superview attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:-Margin]];
                    applied = YES;
                }
                break;
            }
        }
    }
    
    
    + (void)setupNavBarBtnWithNavItem:(UINavigationItem *)navItem view:(UIView *)view position:(MANavBarBtnPosition)position {
        
        if ([UIDevice currentDevice].systemVersion.floatValue >= 11.0) {
            MANavBarBtnView *barBtnView = [[MANavBarBtnView alloc] initWithFrame:view.frame];
            [barBtnView setPosition:position];
            [barBtnView addSubview:view];
            
            UIBarButtonItem *btnItem = [[UIBarButtonItem alloc] initWithCustomView:barBtnView];
            if (position == MANavBarBtn_Left) {
                [navItem setLeftBarButtonItem:btnItem];
            } else {
                [navItem setRightBarButtonItem:btnItem];
            }
        } else {
            UIBarButtonItem *space = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:NULL];
            [space setWidth:-Margin];
            
            NSArray *items = @[space, [[UIBarButtonItem alloc] initWithCustomView:view]];
            if (position == MANavBarBtn_Left) {
                [navItem setLeftBarButtonItems:items];
            } else {
                [navItem setRightBarButtonItems:items];
            }
        }
    }
    
    @end
    

    2. 使用过程

    在有导航栏的Controller中,按如下方式调用即可,如设置左侧返回按钮:

    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        
        [self setupBackItem];
    }
    
    // 设置返回按钮
    - (void)setupBackItem {
        
        if (self.navigationController.topViewController && self.navigationController.viewControllers.firstObject != self) {
            [MANavBarBtnView setupNavBarBtnWithNavItem:self.navigationItem view:[self backButton] position:MANavBarBtn_Left];
        }
    }
    
    - (UIButton *)backButton {
        
        UIImage *normalImage = [[UIImage kk_imageNamed:@"ma_icon_back"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [backButton setImage:normalImage forState:UIControlStateNormal];
        backButton.frame = CGRectMake(.0, .0, 35.0, 40.0);
        backButton.imageEdgeInsets = UIEdgeInsetsMake(.0, -8.0, .0, 8.0);
        backButton.tintColor = [self.page.window.navigationBarTextStyle isEqualToString:@"white"]? [UIColor whiteColor]: [UIColor blackColor];
        [backButton addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
        
        return backButton;
    }
    

    使用过程中,请注意 MANavBarBtnView 与初始化 navigationItem 时的 customView 之间的区别。

    相关文章

      网友评论

          本文标题:iOS 调整导航栏按钮与边框的距离

          本文链接:https://www.haomeiwen.com/subject/tniuektx.html