• iOS 自定义底部tabbar加号按钮实现方法


    自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个“+号按钮”

    1、自定义WBTabBar,让其继承自UITabBar,并定义点击事件代理方法。

    .h方法里面

    #import <UIKit/UIKit.h>

    @class WXReleaseTabBar;

    @protocol WXReleaseTabBarDelegate <WXReleaseTabBarDelegate>

    @optional

    - (void)tabBarDidClickPlusButton:(WXReleaseTabBar *)tabBar;

    @end

    @interface WXReleaseTabBar : UITabBar

    @property (nonatomic, weak) id<WXReleaseTabBarDelegate> tabBarDelegate;

    @end

    .m方法里面

    //定义一个按钮

    @property (nonatomic, strong) UIButton *plusButton;

    然后初始化

    - (id)initWithFrame:(CGRect)frame

    {

        self = [super initWithFrame:frame];

        if (self) {

            UIButton *plusBtn = [[UIButton alloc] init];

            [plusBtn setBackgroundImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateNormal];

            [plusBtn setBackgroundImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateHighlighted];

            [plusBtn setImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateNormal];

            [plusBtn setImage:[UIImage imageNamed:@"shareicon"] forState:UIControlStateHighlighted];

            plusBtn.size = plusBtn.currentBackgroundImage.size;

            [plusBtn addTarget:self action:@selector(plusClick) forControlEvents:UIControlEventTouchUpInside];

            [self addSubview:plusBtn];

            self.plusButton = plusBtn;

        }

        return self;

    }

    //添加约束

    - (void)layoutSubviews

    {

        [super layoutSubviews];

        CGFloat width = self.width;

        CGFloat height = self.height;

        self.plusButton.center = CGPointMake(width * 0.5, height * 0.5);

        CGRect tempRect = self.plusButton.frame;

        tempRect.origin.y =  -20;

        self.plusButton.frame = tempRect;

        int index = 0;

        CGFloat tabBarButtonW = width / 5;

        CGFloat tabBarButtonH = height;

        CGFloat tabBarButtonY = 0;

        

        for (UIView *tabBarButton in self.subviews) {

            if (![NSStringFromClass(tabBarButton.class) isEqualToString:@"UITabBarButton"]) continue;

            CGFloat tabBarButtonX = index * tabBarButtonW;

            if (index >= 2) {

                tabBarButtonX += tabBarButtonW;

            }

            tabBarButton.frame = CGRectMake(tabBarButtonX, tabBarButtonY, tabBarButtonW, tabBarButtonH);

            index++;

        }

        [self bringSubviewToFront:self.plusButton];

    }

    //重写系统的hitTest方法让处于tabbar外部的按钮部分也可以被点击

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

        if (self.isHidden == NO) { // 当前界面 tabBar显示

            CGPoint newPoint = [self convertPoint:point toView:self.plusButton];

            if ( [self.plusButton pointInside:newPoint withEvent:event]) { // 点 属于按钮范围

                return self.plusButton;

            }else{

                return [super hitTest:point withEvent:event];

            }

        }else {

            return [super hitTest:point withEvent:event];

        }

    }

     //被点击的方法

    - (void)plusClick

    {

        // 通知代理

        if ([self.tabBarDelegate respondsToSelector:@selector(tabBarDidClickPlusButton:)]) {

            [self.tabBarDelegate tabBarDidClickPlusButton:self];

        }

    }

    2、tabBar是UITabBarController的只读成员变量(属性),是不让修改的,在UITabBarController.m中的操作如下:

    @interface WXTabbarViewController ()<UITabBarDelegate>

     @end

    3、然后在UITabBarController.m初始化里面我们可以使用KVC的方式,更换系统自带的UITabBar,实现代码如下:

    xxxTabBar(自定义的tabbar) *tabBar = [[xxxTabBar alloc] init]; 

    xxxTabBar.tabBarDelegate= self;
    [self setValue:tabBar forKeyPath:@"tabBar"];

    4、在UITabBarController.m实现点击的代理方法

    - (void)tabBarDidClickPlusButton:(WXReleaseTabBar *)tabBar

    {

        NSLog(@"发布按钮");

    //    ComposeViewController *composeViewController= [[ComposeViewController alloc] init];

    //    UINavigationController * navigationController = [[UINavigationController alloc]initWithRootViewController:composeViewController];

    //    [self presentViewController:navigationController animated:YES completion:nil];

    }

  • 相关阅读:
    (二)建筑物多边形化简系列——多边形点数化简
    (一)建筑物多边形化简系列——去除噪点环
    (三)建筑物多边形化简系列——去除冗余点
    (五)建筑物多边形化简系列——最小外接矩形的获取
    vue笔记
    学习react基础知识(五)
    学习react基础知识(四)
    学习react基础知识(三)
    学习react基础知识(二)
    学习react基础知识(一)
  • 原文地址:https://www.cnblogs.com/FZP5/p/10019678.html
Copyright © 2020-2023  润新知