美文网首页
[iOS 控件]按钮下划线随点击事件移动

[iOS 控件]按钮下划线随点击事件移动

作者: Koneey | 来源:发表于2015-10-28 13:53 被阅读2617次

前言

在开发项目当中, 我需要用到一组特殊按钮, 效果如下:


效果效果

虽然现在 git 上现成的代码一抓一箩筐, 但是想来貌似我时间也不怎么值钱, 就加一会班写写看. 编码思路如下:

分析

立马能想到的就是自己新建一个 View, 把按钮一个一个放上去, 点击按钮触发是事件, 移动按钮下的小白线(underLine).
新建的 View 需要暴露的接口有:

  • 初始化方法, 需要传入按钮标题 数组
    (nullable instancetype)initWithItems:(nullable NSArray *)items;
  • 点击不同按钮时, 执行 action
    (void)addTarget:(nullable id)target action:(nonnull SEL)action;

实现

主要代码如下
添加按钮

- (void)setButtons
{
    int i = 0;
    for (NSString *titleStr in _items) {
        UIButton *button = [[UIButton alloc] init];
        button.tag = 1000+i;
        [button setTitle:titleStr forState:UIControlStateNormal];
        [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];
        i++;
    }
    
    UIView *underLine = [[UIView alloc] init];
    underLine.backgroundColor = [UIColor whiteColor];
    underLine.tag = kLUHUnderLineButtonUnderLineTag;
    underLine.layer.cornerRadius = kLUHUnderLineButtonUnderLineHeight/2;
    [self addSubview:underLine];
}

计算位置

    CGFloat width = CGRectGetWidth(self.frame)/_items.count;
    CGFloat height = CGRectGetHeight(self.frame);
    for (int i = 0; i < _items.count; i++) {
        UIButton *button = (UIButton *)[self viewWithTag:1000+i];
        if (button != nil) button.frame = CGRectMake(i*width, 0, width, height);
    }
    
    UIView *underLine = [self viewWithTag:kLUHUnderLineButtonUnderLineTag];
    CGFloat underLineW = width - 2*kLUHUnderLineButtonUnderLinePadding;
    if (underLine != nil) {
        underLine.frame = CGRectMake(self.selectedIndex*underLineW + kLUHUnderLineButtonUnderLinePadding, height-kLUHUnderLineButtonUnderLineHeight,
                                     underLineW, kLUHUnderLineButtonUnderLineHeight);
    }

按钮点击之后

- (void)buttonAction:(UIButton *)button
{
    NSInteger index = button.tag-1000;
    if (index == self.selectedIndex) return;
    self.selectedIndex = index;
    if (self.action != nil) {
        [self.target performSelectorOnMainThread:self.action withObject:button waitUntilDone:NO];
    }
}

源码

相关文章

  • [iOS 控件]按钮下划线随点击事件移动

    前言 在开发项目当中, 我需要用到一组特殊按钮, 效果如下: 虽然现在 git 上现成的代码一抓一箩筐, 但是想来...

  • 设置按钮的下划线,跟着点击的按钮移动

    需求:给按钮加个下划线,点击哪个按钮就显示到哪个按钮下面,跟着点击的按钮移动 实现的要点: 1.下划线用什么控件去...

  • 使用Active控件

    按钮 VBA中设置按钮的属性 按钮的事件 按钮最重要的事件 -- 点击点击就触发一次事件 标签 单选按钮控件 同...

  • WPF路由

    举例:窗口-用户控件-布局控件-…-按钮 按钮的点击事件:先由按钮的Click相应,然后….,然后布局控件,然后用...

  • 跟随手指的小球【自定义View】

    需求:1.小球可以随着手指移动而移动,在移动完成后,不会调用该控件的点击事件。2.点击控件不移动的话,就是点击事件...

  • iOS 按钮如何边动画边实现点击事件

    常规思路,移动frame,这种方法是行不通的,在按钮移动的时候,只能点击按钮的最终位置才会响应事件,点击按钮本身是...

  • H5编写指南

    常见问题汇总: 移动端点击事件按钮变色 具体表现:安卓端点击变蓝色,ios端点击留黑色框 解决方案:在所有的a标签...

  • 按钮下划线随着按钮点击移动效果

    先创建一个UIView来放置按钮:titleView; 在titleView上添加按钮 首先需要确定按钮的数量 根...

  • iOS14以上,UITableViewCell中的控件,点击无效

    适配iOS14系统,发现很多列表中的小按钮点击事件不响应,iOS14以下的系统没有异常 这是因为将控件直接添加到c...

  • Flutter 事件与布局 demo

    点击点事 按钮的点击事件,只需要设置 onPressed 参数就可以了: 任意控件的手势事件 跟 button 不...

网友评论

      本文标题:[iOS 控件]按钮下划线随点击事件移动

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