• Stars
    star
    231
  • Rank 173,434 (Top 4 %)
  • Language
    Objective-C
  • Created almost 9 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

视错觉Demo介绍

ZLCustomeSegmentControlView

视错觉Demo

一、一个利用视错觉的自定义组件

当第一次看到这个组件效果时,感觉没有什么特别之处,就是一个普通在普通不过的组件。可是再仔细看就感觉不一样了,一些细节处理的非常好。看到组件效果时,因为没有源码,所以当时也不知道如何实现的。就想呗,然后就想到了用“视错觉”这个高大上的东西来实现。当然这个实现方案是我自己想出来的,我不知道原作者是如何实现的,下面给出了我自己的实现方案。 说这么多,先来看一下运行效果吧。

1. 该组件的运行效果如下,其实就是一个自定义的SegmentControl。看到该组件的时候,我的第一印象是:“这个组件应该挺好做的”。当时感觉就是几个Button, 然后红色的是一个UIView,点击那个Button时,就把UIView通过动画的形式移动到当前点击的Button。顶多就是封装一下,成为一个自定义组件,然后给别人使用。

2.效果分析

在仔细看效果,感觉自己还是太年轻,太单纯了。这个组件远远不是我想的那样,上面组件的实现的重点与难点不在于如何去运动,如何去封装它。而在于下面这个截图中的东西。如果把动画放慢,你会发现一个细节,这个细节处理的非常的巧妙,也是这个组件的亮点与难点所在。下方是切换时放慢的一个效果。看到这个细节时,瞬间颠覆了我之前单纯的想法。这个组件远远没有我想的这么简单。

在切换时,有一个细节,就是在红色区域中的文字(或文字的一部分)随着红色区域的移动,文字的颜色也会随之部分改变。当红色区域移动过后,字体颜色又变为原来的了。看到这个效果,对这个组件的崇拜感就油然而生了。瞬间也蒙圈了,一时没有解决思路。大脑中充满了无数的问号。这究竟用了什么黑科技!?实现了这么NX的效果。晚上做地铁回家的时候也一直在想其解决方案。果然在地铁上灵光一现,应该就是用它:“视错觉”。于是乎就回家晚饭都没吃,就拿出笔记本开始按着自己的思路去实现。功夫不负有心人呢,所以才有了今天的博客。当然实现上述效果是我自己的思路,如果还有其他更好的实现方式欢迎交流。        

二.实现原理

1.原理介绍

实现上述效果时,如果按着我看到的就是看到的来实现的话,估计会无从下手的。一个原则:“眼见为虚”,就OK了。今天这篇博客,我不想往上粘贴过多的代码,还是把我的思路给大家分享一下就好。其实编程这东西,有时候思路比代码更为重要。下方我想用在Reveal工具上的分析层次来给大家聊一下实现原理。 通过Reveal上面的UI层次我们很容易看出,这个组件远比我们想象的要复杂的多。我的实现方式如下:

  • (1) 先在View上加上一层的Label, 这些Label用来显示常规的字体颜色(未选中时的颜色)(黑色的字)
  • (2) 在之前的Label上添加一层View , 动画元素,高亮显示的字体,点击的按钮都在这个View上
  • (3) 在这个View上添加一层高亮的Label(白色的字), Label的字体,大小,位置等要和底层的Label一致(除了颜色除外)
  • (4) 上层的View的大小要和一个Label的大小一致,并且设置超出View的子视图不显示。
  • (5) 移动View(红色部分)时,也要移动View上白色的字。要保持移动的过程中,白色Label和黑色label完全重合。

这样View移动到那个label上时,就会把后边的黑色Label给挡上,显示的是上面白色的Label.原理大概就是这个原理,原理一旦知道怎么回事了,至于实现起来就简单许多了。     

2.该自定组件可配置项如下

//
//  ZLCustomeSegmentControlView.h
//  CustomeSegmentControl
//
//  Created by ZeluLi on 15/11/19.
//  Copyright © 2015年 zeluli. All rights reserved.
//

#import <UIKit/UIKit.h>

typedef void(^ButtonOnClickBlock)(NSInteger tag, NSString * title);

@interface ZLCustomeSegmentControlView : UIView

@property (nonatomic, strong) NSArray *titles;                      //标题数组
@property (nonatomic, strong) UIColor *titlesCustomeColor;          //标题的常规颜色
@property (nonatomic, strong) UIColor *titlesHeightLightColor;      //标题高亮颜色
@property (nonatomic, strong) UIColor *backgroundHeightLightColor;  //高亮时的颜色
@property (nonatomic, strong) UIFont *titlesFont;                   //标题的字号
@property (nonatomic, assign) CGFloat duration;                     //运动时间

/**
*  点击按钮的回调
*
*  @param block 点击按钮的Block
*/
-(void) setButtonOnClickBlock: (ButtonOnClickBlock) block;

@end

3.该自定义组件的调用方式

ZLCustomeSegmentControlView *v = [[ZLCustomeSegmentControlView alloc] initWithFrame:CGRectMake(30, 100, SCREEN_WIDTH - 60, 50)];

v.titles = @[@"Hello", @"Apple", @"Swift", @"Objc"];
v.duration = 0.7f;

[v setButtonOnClickBlock:^(NSInteger tag, NSString *title) {
    NSLog(@"index = %ld, title = %@", (long)tag, title);
}];

[self.view addSubview:v];

More Repositories

1

MVP

MVP
Objective-C
815
star
2

CATransitionDemo

注:其中有些效果调用了CATransition的Private API, 仅供娱乐
Objective-C
372
star
3

DataStruct-Swift

数据结构相关Swift示例,相关博客地址:
Swift
178
star
4

ObjCRuntimeDemo

http://www.cnblogs.com/ludashi/p/6294112.html
Objective-C
174
star
5

SliderTabBar

多个表视图手势切换,加手势的选项卡~
Objective-C
140
star
6

WeChat

妨微信聊天
Objective-C
119
star
7

CEThemeSwitcher

http://www.cnblogs.com/ludashi/p/6289741.html
Swift
66
star
8

DisplayTestDemo

UI性能测试
Objective-C
63
star
9

MVVMWithReactiveCocoa

一个使用ReactiveCocoa的MVVM
Objective-C
58
star
10

MaskLayerDemo

MaskLayer的使用
Swift
48
star
11

PerfectDemo

使用Swift的Perfect开发Web服务端
Makefile
46
star
12

ZLImageScrollView

http://www.cnblogs.com/ludashi/p/4748209.html#3401571
Objective-C
45
star
13

ZLImageViewDisplay

iOS图片轮播
Objective-C
42
star
14

MasonryDemo

MasonryDemo和Masonry源码解析
Objective-C
41
star
15

DesignPatterns-Swift

使用Swift实现的常用设计模式示例
Swift
34
star
16

CodeRefactoring-Swift

重构·改善既有代码的设计(Swift版)
Swift
32
star
17

LoginManagerSDKSimpleDemo

登录SDK简化版Demo,对应博客地址:
Objective-C
29
star
18

FlyOver

Swift
27
star
19

FATabSwitchView

频道选择放大组件
Swift
26
star
20

GCDDemo-Swift

GCD 内容相关Demo, Swift版
Swift
23
star
21

CustomWaterfallFlow

使用UICollectionView,自定义布局实现可定制化的瀑布流
Objective-C
19
star
22

CEImagesScrollDisplay

iOS幻灯片(参考淘宝幻灯片实现)
Swift
18
star
23

CEScrollMenue

资讯类App中的分类展示、分类切换、分类编辑
Swift
14
star
24

NotificationWithSubThread

NotificationWithSubThread
Objective-C
13
star
25

CESelectThemes

Swift
11
star
26

NSTimerWithRunLoop

Swift
10
star
27

CollectionViewControllerDemo

CollectionView中自带的流试布局
Objective-C
10
star
28

NSURLSessionDemo

URLSession for Swift3.0
Swift
9
star
29

FPSProfileDemo

Objective-C
9
star
30

iOS_NetWorkingAndAlamofire

iOS网络编程与Alamofire源码解析
Swift
9
star
31

SpringDemo

JavaEE开发框架Spring4+相关Demo
Java
8
star
32

CustomCollectionViewLayout

Objective-C
8
star
33

SwiftDelegateDemo

Swift中协议以及委托代理回调实例
Swift
8
star
34

SpringBootProject

Java
7
star
35

SpotlightSearchDemo

Objective-C
7
star
36

DependencyInjectionForiOS

iOS中的依赖注入
Objective-C
7
star
37

CustomTransformCollecionLayout

使用CollectionView自定义相片浏览器。博客地址:
Objective-C
7
star
38

TellBook

iOS通讯录
Objective-C
6
star
39

AutoLayoutContentHuggingAndCompressionResistance

AutoLayout Content Hugging And Compression Resistance Demo
Swift
5
star
40

CustomeFaceKeyBoard

自定义表情键盘,支持历史表情记录
Objective-C
5
star
41

CGAffineTransformDemo

仿射变换总结-Swift版
Swift
4
star
42

ChatDemo

微信聊天部分实现
Objective-C
3
star
43

AndroidBaseControlAndLayout

安卓开发基本控件和四种布局方式
Java
3
star
44

TipSwiftForRac

Swift
3
star
45

ProvincePickerDemo

省市Picker
PHP
3
star
46

SQLiteResource

SQLite相关博文所需资源
C
2
star
47

SpringMVCWithMaven

Java
2
star
48

AspectOrientedForiOS

iOS面向切面编程
Objective-C
2
star
49

SinaWeibo

新浪微博客户端实现
Objective-C
2
star
50

ReactNativeTestDemo

RN相关的使用示例
TypeScript
2
star
51

PDFWithQLPreviewController

PDF文件下载并预览
Swift
1
star
52

AndroidListViewDemo

Android开发中ListView使用实例
Java
1
star
53

BlueToothDemo

一个关于BLE4.0的Demo
Objective-C
1
star
54

CEExtension-Swift

iOS开发常用扩展-Swift版, Updating……
Swift
1
star
55

AndroidCustomNavigationBar

安卓中自定义导航栏
Java
1
star
56

CETabDisplay

标签展示
Swift
1
star
57

Location

地图定位
Objective-C
1
star