实现一个简单的button 先给出github链接
效果:
需求:
点击,隐藏button上文字,将显示一个菊花,表示正在处理网络请求或者其他任务
再次点击,显示button文字,菊花停止转动,恢复最初状态
主要一下几个步骤:
- 创建一个button的子类
- 给button添加一个UIActivityIndicatorView(俗称菊花)
- 在特定的时机,开启关闭旋转
代码:
创建button子类,PZLoadingButton
#import <UIKit/UIKit.h>
@interface PZLoadingButton : UIButton
- (void)startLoading;
- (void)stopLoading;
@end
需要两个接口,一个开始loading,一个停止loading
具体实现如下:
@property (nonatomic, strong) UIActivityIndicatorView * indecator;
- (void)startLoading {
self.titleLabel.alpha = 0;
[self.indecator startAnimating];
}
- (void)stopLoading {
self.titleLabel.alpha = 1;
[self.indecator stopAnimating];
}
那我们在button创建的时候将UIActivityIndicatorView添加到button上,添加button要考虑以下情况:
- 使用xib或storyboard + autolayout
xib和 autolayout拖控件方式会调用- (id)initWithCoder:(NSCoder *)aDecoder
方法- 使用代码 + frame
纯代码使用便利构造器+ (id)buttonWithType:(UIButtonType)buttonType
会调用- (instancetype)initWithFrame:(CGRect)frame
方法
分别对应以下两种初始化方法:
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self commentInit];
[self setupConstrains];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self commentInit];
[self setupConstrains];
}
return self;
}
因为创建的菊花默认状态下是显示的,
- (void)commentInit
方法主要功能就是将其隐藏。
- (void)commentInit {
self.indecator.hidden = YES;
self.indecator.userInteractionEnabled = NO;
self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
self.contentHorizontalAlignment =UIControlContentHorizontalAlignmentCenter;
}
- (void)setupConstrains {
//X方向居中
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.indecator attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];
//Y方向居中
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.indecator attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];
//宽25
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.indecator attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1 constant:25]];
//高25
[self addConstraint:[NSLayoutConstraint constraintWithItem:self.indecator attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:1 constant:25]];
}
到此为止,详细功能见代码