文档章节

ios 实现选中时阴影效果

zh_iOS
 zh_iOS
发布于 2017/06/13 17:48
字数 640
阅读 63
收藏 0

ios UI控件在选中高亮的时候一般都会添加高亮效果,以提示用户当前选中的视图,提高用户体验。

UIButton 和 UITableViewCell 系统都有设置高亮时的阴影效果的API,这里不多做赘述。 像UIImageView,UIView,或者是这些控件组合起来的类似卡片类型控件。这些控件可以通过添加UITapGestureRecognizer达到和按钮一样的效果,这是就需要在这些控件上添加选中的时的高亮效果。实现这种效果的方法有两种:

1.在这些空间上加一个可以改变背景颜色的view,然后监听他的  touchesBegin/end/cancel 方式,来改变背景颜色。具体代码如下:

// 开始触摸时添加背景色
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    self.backgroundColor = [UIColor colorWithHexString:@"f8f8f8"];
}
// 结束时清除背景色
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    if (self.shouldShowSelectedBg) {
       self.backgroundColor = [UIColor clearColor];
    }
}
// 手势移动的时候清除背景色
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
    if (self.shouldShowSelectedBg) {
       self.backgroundColor = [UIColor clearColor];
    }
}

由于是单独添加了一个可变颜色的背景view,所以可以通过控制view的frame 来控制高亮时的阴影view的frame。

2.在view的touchesBegin方式触发时,当前的view 的最底部插入一个带有阴影色view,在touchesEnded/cancel 的时候把这个view移除。具体实现如下:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    
    if (!self.selectedBgView) {
        UIView *v = [[UIView alloc] initWithFrame:self.shadowView.bounds];
        self.selectedBgView = v;
        v.backgroundColor = [UIColor colorWithHexString:@"f8f8f8"];
    }
    [self.bgView insertSubview:self.selectedBgView atIndex:0];
}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    [self.selectedBgView removeFromSuperview];
}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
    [self.selectedBgView removeFromSuperview];
}

两种方式对比各有有优缺点。

方法1需要在view中额外加一个view 增加内存的时候,但是可以多个view 都继承与该view ,可以不用再每个view 都写一遍 touchesBegin/end/cancel 方法,减少了代码的冗余。

方法2只有在选中高亮的时候才会添加view,可以减少内存的使用,但是如果有多个view都要添加高亮效果时,需要在每个view中都写一遍类似代码,增加了代码的冗余。

鱼与熊掌不可兼得,根据情况决定使用那种方式即可。

注意:1.不能在 touchesMoved 方法中把背景view移除,否则选中之后背景view会被立即移除。

        2.背景view是插在最底层的,而不是盖在最上面。

© 著作权归作者所有

共有 人打赏支持
zh_iOS
粉丝 28
博文 73
码字总数 34061
作品 0
石景山
程序员
私信 提问
使用 Dojo Mobile 为 iOS 智能终端开发 Native-like Web 应用

简介 iOS 是 Apple 公司为 iPhone、iPod Touch、iPad 以及 iTV 等系列数码产品推出的一套基于 Mac OS X 并高度定制化的操作系统。随着这些数码产品的日益普及,越来越多的开发者加入到为其编...

IBMdW
2011/09/14
1K
1
定制iOS 7中的导航栏和状态栏

由于种种原因,申请了一个开源中国的帐号,也许会由于我的不耐心,不会亲自去一步步的写博文,但准备把自己看到的好的,都转载过来,就当时资源的存储,也算是一种推广吧。 iOS 7 教程:定制...

谁家的阿毛
2013/11/21
0
0
React Navigation

https://reactnavigation.org/docs/intro/nesting 官网 http://blog.csdn.net/u013718120/article/details/72357698 http://www.jianshu.com/p/2f575cc35780 这里只是基本用法,高级详情用法......

Chason-洪
2017/11/15
0
0
iOS 7大量设计细节:黑色、白色,各种扁平设计

苹果将在下个月10号举行的WWDC 2013上推出下一代iOS和OS X,苹果iPhone、iPad和iPod touch将迎来界面大改的iOS 7。今天,据消息人士又给出了下一代iOS操作系统的设计细节。 苹果工业设计主管...

oschina
2013/05/25
4.7K
32
iOS与JS交互之UIWebView-协议拦截

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「UIWebView拦截协议」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
2018/08/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

第11章 多线程

程序、进程、线程 程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。 **进程(process)**是程序的一次执行过程或是正在运行的一个程序。动...

流小文
45分钟前
4
0
SpringBoot引入第三方jar包或本地jar包的处理方式

在开发过程中有时会用到maven仓库里没有的jar包或者本地的jar包,这时没办法通过pom直接引入,那么该怎么解决呢 一般有两种方法 - 第一种是将本地jar包安装在本地maven库 - 第二种是将本地j...

独钓渔
今天
2
0
五、MyBatis缓存

一、MyBatis缓存介绍 缓存的使用可以明显的加快访问数据速度,提升程序处理性能,生活和工作中,使用缓存的地方很多。在开发过程中,从前端-->后端-->数据库等都涉及到缓存。MyBatis作为数据...

yangjianzhou
今天
2
0
最近研究如何加速UI界面开发,有点感觉了

最近在开发JFinal学院的JBolt开发平台,后端没啥说的,做各种极简使用的封装,开发者上手直接使用。 JBolt开发平台包含常用的用户、角色、权限、字典、全局配置、缓存、增删改查完整模块、电...

山东-小木
今天
3
0
《月亮与六便士》的读后感作文3000字

《月亮与六便士》的读后感作文3000字: 看完英国作家威廉.萨默塞特.毛姆所著《月亮与六便士》(李继宏译),第一疑问就是全书即没提到“月亮”,也没提到“六便士”。那这书名又与内容有什么...

原创小博客
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部