大家好,今天我来教大家封装一个滚动视图,额,其实我也不确定它应该叫什么名字,所以我就起名字为YCSegment了。看下图大家应该就能明白是神马。。
(还望各位高手指出不足)
依然推荐新手学习,这次的代码为Objective-C。
在本文中你将会学习到:
- 封装
- 懒加载
- 协议/代理
- KVO(键值观察者)
- Target – Action 模式
- 通过文本内容和字体计算Label的宽度或高度
结构如下:
首先我们从 item 开始:
不包括下面橘黄色的杠杠!!
上代码。
首先新建一个类,继承自UIView。我命名为:YCSegmentViewTitleItem
自定义一个初始化方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@interface YCSegmentViewTitleItem : UIView ///标题(我们希望可以后期更改标题) @property (nonatomic,copy) NSString *title; ///间距(我们希望可以控制如果有多个item他们文字的间距) @property (nonatomic,assign) CGFloat space; …… - (instancetype)initWithFrame:(CGRect)frame title:(NSString *)title; …… @end |
意图是给它一个需要显示的字符串和它的位置,然后让它自己去搞定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
@interface YCSegmentViewTitleItem () …… @property (nonatomic,strong) UILabel *titleLabel; @end @implementation YCSegmentViewTitleItem - (instancetype)initWithFrame:(CGRect)frame title:(NSString *)title { self = [super initWithFrame:frame]; if (self) { self.space = 8; self.title = title; } return self; } …… @end |
大家有没有发现,在这里进行了一些赋值,但是我们没有初始化titleLabel啊!
而且为毛线我们要给 self.title
赋值为title
!
其实是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@implementation YCSegmentViewTitleItem …… - (void)setTitle:(NSString *)title { _title = title; self.titleLabel.text = title; [self setNeedsLayout]; } …… @end |
我们实现了title
属性的setter
方法,在里面给实例变量_title
赋值用来保存值,然后我们给self.titleLabel.text
赋值为title
, 最后希望它从新布局,因为可能会改变宽度啊。
那么titleLabel
在哪初始化?
这里我用了懒加载的方法来初始化这个titleLabel
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
@implementation YCSegmentViewTitleItem ……… - (UILabel *)titleLabel { if (!_titleLabel) { _titleLabel = [[UILabel alloc] initWithFrame:self.bounds]; _titleLabel.textColor = _defaultTitleColor_Normal; _titleLabel.font = _defaultFont; _titleLabel.textAlignment = NSTextAlignmentCenter; [self addSubview:_titleLabel]; } return _titleLabel; } @end |
包括了初始化、颜色、字体、居中、添加为self的子视图等。。
!小贴士:
Objective-C中的懒加载的写法是重写某一个属性的getter。因为有些情况下我们并不能够确定什么时候初始化一个数组或者字典。多数用在网络请求之后保存结果等。。万一这个数组或者字典你用不到呢?给它个内存空间多浪费呀。所以什么时候用什么时候初始化。
注意!在getter中不要用self.titleLabel
!会产生递归的。。。因为self.titleLabel
实际上就是[self titleLabel]
或[self setTitleLabel:_]
~
懒加载节省了系统响应时间,提升了系统性能,非常具有利用价值。( 虽然在本项目中没什么体现。。以后有机会详细讲解喽 )
这样,一旦调用初始化方法,就完成了label的赋值操作等。接下来我们还需要布局: