自定义天气框小控件

一、封装了一个简便好用的天气框控件,有几个特点:

1、轻量级,使用百度天气接口,显示某个城市当前的天气,配有天气图标,日期。

2、使用封装的初始化方法,实例化控件,天气框的大小是固定的,字体颜色可以改变。

3、需要AFNetworking、SDWebImage框架(一般的项目中都会使用)、使用了一个关于UIView的frame扩展(方便控件的布局,已在下文贴出源码)。

4、点击天气框任意位置自动移除。

5、效果图示:

二、原代码:

1、.h中的声明

@interface ZQWeatherView : UIView

/**
 *  需要AFNetworking、SDWebImage框架 ; 加载的是当天的天气 ; 宽110,高73 ; 点击天气框移除
 *
 *  @param frame 天气框架的frame,宽高无效
 *  @param city  城市
 *  @param color 文字的颜色
 *
 *  @return 返回天气框
 */
-(instancetype)initWithFrame:(CGRect)frame City:(NSString*)city WritingColor :(UIColor *)color;

@end

2、网络请求的一些参数,定义了两个宏,使用方便

//定义百度天气的KEY
#define kBDWeather_KEY @"17IvzuqmKrK1cGwNL6VQebF9"

//定义百度天气的接口URL
#define kGetWeather_URL(city) ([NSString stringWithFormat: @"http://api.map.baidu.com/telematics/v3/weather?location=%@&output=json&ak=%@", city, kBDWeather_KEY])

3、.m中的全局私有属性

@interface ZQWeatherView ()

@property (nonatomic,strong) UIImageView * img;

@property (nonatomic,strong) UILabel * lab;

@property (nonatomic,strong) UILabel * dateLabel;

@property (nonatomic,strong) UILabel * city;

@property (nonatomic,strong)UIButton * cancleBtn;

@property(nonatomic,strong) UIView * back;

@property (nonatomic,strong) NSDictionary * weatherDataDict;

@property (nonatomic,strong) UIActivityIndicatorView * acView;

@end

4、.m文件中其他内容

  1 //提供对象方法初始化控件
  2
  3 -(instancetype)initWithFrame:(CGRect)frame City:(NSString*)city WritingColor :(UIColor *)color
  4 {
  5
  6     self = [super init];
  7
  8     if (self) {
  9
 10         //传入的宽高无效
 11         self.frame = CGRectMake(frame.origin.x, frame.origin.y, 110, 73);
 12         self.backgroundColor = [UIColor clearColor];
 13         self.layer.cornerRadius = 5;
 14         self.layer.masksToBounds = YES;
 15
 16         //生成背后的蒙版
 17         self.back = [[UIView alloc]init];
 18         self.back.backgroundColor=[UIColor blackColor];
 19         self.back.alpha=0.3;
 20         [self addSubview:self.back];
 21
 22
 23         //天气图标
 24         self.img = [[UIImageView alloc]init];
 25         self.img.layer.cornerRadius=3;
 26         self.img.layer.masksToBounds=YES;
 27         [self addSubview:self.img];
 28
 29         //天气信息
 30         self.lab = [[UILabel alloc]init];
 31         self.lab.font=[UIFont systemFontOfSize:14];
 32         [self addSubview:self.lab];
 33
 34         //添加城市信息
 35         self.city = [[UILabel alloc]init];
 36         [self.city sizeToFit];
 37         self.city.font=[UIFont systemFontOfSize:18];
 38         [self addSubview:self.city];
 39         self.city.textAlignment = NSTextAlignmentCenter;
 40
 41         //日期栏
 42         self.dateLabel= [[UILabel alloc]init];
 43         self.dateLabel.font = [UIFont systemFontOfSize:11];
 44         [self addSubview:self.dateLabel];
 45
 46
 47
 48         //添加一个按钮,移除天气框(按钮大小和天气框一样)
 49         self.cancleBtn = [[UIButton alloc]init];
 50         [self.cancleBtn setBackgroundColor:[UIColor clearColor]];
 51         [self.cancleBtn addTarget:self action:@selector(cancleClick:) forControlEvents:UIControlEventTouchUpInside];
 52         [self addSubview:self.cancleBtn];
 53
 54
 55         dispatch_async(dispatch_get_main_queue(), ^{
 56
 57             [self.acView startAnimating];
 58
 59             //加载天气数据 (百度天气)
 60
 61             [self loadWeatherData:city];
 62
 63         });
 64
 65         //设置几个控件的文字颜色
 66         self.lab.textColor = color;
 67         self.dateLabel.textColor= color;
 68         self.city.textColor = color;
 69     }
 70     return self;
 71 }
 72
 73
 74
 75 //加载数据
 76 - (void)loadWeatherData:(NSString *)city {
 77
 78     NSString *urlString = kGetWeather_URL(city);
 79
 80     // 百分号转义
 81     urlString = [urlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
 82
 83     //通过AFN 创建网络管理,发送网络请求
 84     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
 85
 86     [manager GET:urlString parameters:nil progress:^(NSProgress * _Nonnull downloadProgress) {
 87     } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
 88
 89
 90         NSDictionary *dict = (NSDictionary *)responseObject;
 91
 92         //有数据时再往下进行
 93         if (dict[@"results"]) {
 94
 95         [self.acView stopAnimating];
 96
 97
 98         self.weatherDataDict = dict;
 99
100         //获取数据了,直接给控件赋值
101
102         // 1 图片
103         NSDictionary *dateDict = dict[@"results"][0][@"weather_data"][0];
104
105         NSString *urlString = dateDict[@"dayPictureUrl"];
106
107         NSURL *url = [NSURL URLWithString:urlString];
108
109         [self.img sd_setImageWithURL:url];
110
111         [self.img sizeToFit];
112
113         //2 温度
114         NSString *temper = dateDict[@"date"];
115
116         //字符串转为数组
117         NSArray *arr = [temper componentsSeparatedByString:@" "];
118
119         NSString *arrthree = arr[2];
120
121         NSString *temperlab1 = [arrthree substringFromIndex:4];
122
123         NSString *temperlab =[temperlab1 substringToIndex:(temperlab1.length -1)];
124
125         self.lab.text = [NSString stringWithFormat:@"今日温度:%@",temperlab];
126
127         [self.lab sizeToFit];
128
129         //3 日期
130         self.dateLabel.text = dict[@"date"];
131
132         [self.dateLabel sizeToFit];
133
134         //4 城市
135         self.city.text = city;
136
137
138     }
139
140
141     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
142
143         NSLog(@"网络错误");
144     }];
145
146
147
148 }
149
150 //布局所有子控件
151 -(void)layoutSubviews {
152
153     [super layoutSubviews];
154
155     //布局
156
157     self.lab.frame = CGRectMake(10,8, self.lab.width, self.lab.height);
158
159     self.city.frame = CGRectMake(10, self.lab.bottom+2, self.width-35, 25);
160
161     self.img.frame = CGRectMake(self.width-10-20,self.lab.bottom+5,24,24);
162
163     self.dateLabel.frame = CGRectMake(10,self.city.bottom+3,self.dateLabel.width, self.dateLabel.height);
164     self.cancleBtn.frame=CGRectMake(0, 0, self.width, self.height);
165     self.back.frame=CGRectMake(0, 0, self.width, self.height);
166
167     self.acView.center = CGPointMake(self.width/2, self.height/2);
168
169
170 }
171
172
173
174 //移除天气框的方法
175 -(void)cancleClick:(UIButton *)btn
176 {
177     [self removeFromSuperview];
178 }
179
180 //懒加载储存天气信息的字典
181 - (NSDictionary *)weatherDataDict {
182
183     if (!_weatherDataDict) {
184
185         _weatherDataDict = [[NSDictionary alloc]init];
186     }
187     return _weatherDataDict;
188 }
189
190 //菊花转轮
191 -(UIActivityIndicatorView *)acView
192 {
193     if (!_acView) {
194         _acView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
195
196         [self addSubview:_acView];
197     }
198
199     return _acView;
200
201 }
202

5、关于类扩展UIView+EXTFrame.h

@interface UIView (EXTFrame)

@property (nonatomic,assign) CGFloat x;
@property (nonatomic,assign) CGFloat y;
@property (nonatomic,assign) CGFloat width;
@property (nonatomic,assign) CGFloat height;
@property (nonatomic, assign) CGPoint origin;
@property (nonatomic, assign) CGFloat left;
@property (nonatomic, assign) CGFloat right;
@property (nonatomic, assign) CGFloat top;
@property (nonatomic, assign) CGFloat bottom;

@end

6、关于类扩展UIView+EXTFrame.m

@implementation UIView (EXTFrame)

-(void)setX:(CGFloat)x
{
    CGRect rect = self.frame;
    rect.origin.x=x;
    self.frame = rect;
}

-(CGFloat)x
{
  return self.frame.origin.x;
}

-(void)setY:(CGFloat)y
{
    CGRect rect = self.frame;
    rect.origin.y=y;
    self.frame=rect;
}

-(CGFloat)y
{
    return self.frame.origin.y;
}

-(void)setWidth:(CGFloat)width
{
    CGRect rect = self.frame;
    rect.size.width=width;
    self.frame=rect;
}

-(CGFloat)width
{
    return self.frame.size.width;
}

-(void)setHeight:(CGFloat)height
{
    CGRect rect = self.frame;
    rect.size.height=height;
    self.frame=rect;
}

-(CGFloat)height
{
    return self.frame.size.height;
}

- (CGPoint)origin
{
    return self.frame.origin;
}

- (void)setOrigin:(CGPoint)origin
{
    CGRect frame = self.frame;
    frame.origin = origin;
    self.frame = frame;
}

- (void)setLeft:(CGFloat)left
{
    self.origin = CGPointMake(left, self.origin.y);
}

- (CGFloat)left
{
    return self.origin.x;
}

- (void)setRight:(CGFloat)right
{
    self.origin = CGPointMake(right - self.width, self.origin.y);
}

- (CGFloat)right
{
    return self.origin.x + self.width;
}

- (void)setTop:(CGFloat)top
{
    self.origin = CGPointMake(self.origin.x, top);
}

- (CGFloat)top
{
    return self.origin.y;
}

- (void)setBottom:(CGFloat)bottom
{
    self.origin = CGPointMake(self.origin.x, bottom - self.height);
}

- (CGFloat)bottom
{
    return self.origin.y + self.height;
}

@end

三、备注

最后添加的两个扩展是对UIView的frame 的扩展,可以很方便的设置控件的frame。

时间: 2024-10-11 08:08:10

自定义天气框小控件的相关文章

iOS获取相册/相机图片-------自定义获取图片小控件

一.功能简介 1.封装了一个按钮,点击按钮,会提示从何处获取图片:如果设备支持相机,可以从相机获取,同时还可以从手机相册获取图片. 2.选择图片后,有一个block回调,根据需求,将获得的图片拿来使用. 3.提供了初始化方法,可以灵活定义按钮,包括把返回的图片设置给按钮自己. 二.核心原理 1.UIAlertController 提示框 2.UIImagePickerController 图片拾取控制器 3.isSourceTypeAvailable:UIImagePickerControlle

Android UI设计之<十一>自定义ViewGroup,打造通用的关闭键盘小控件ImeObserverLayout

转载请注明出处:http://blog.csdn.net/llew2011/article/details/51598682 我们平时开发中总会遇见一些奇葩的需求,为了实现这些需求我们往往绞尽脑汁有时候还茶不思饭不香的,有点夸张了(*^__^*)--我印象最深的一个需求是在一段文字中对部分词语进行加粗显示.当时费了不少劲,不过还好,这个问题最终解决了,有兴趣的童靴可以看一下:Android UI设计之<六>使用HTML标签,实现在TextView中对部分文字进行加粗显示. 之前产品那边提了这样

自定义下拉刷新控件

一.功能效果 1.在很多app中,在信息展示页面,当我们向下拖拽时,页面会加载最新的数据,并有一个短暂的提示控件出现,有些会有加载进度条,有些会记录加载日期.条目,有些还带有加载动画.其基本实现原理都相仿,本文中将探讨其实现原理,并封装出一个简单的下拉刷新控件 2.自定义刷新工具简单的示例 二.系统提供的下拉刷新工具 1.iOS6.0以后系统提供了自己的下拉刷新的控件:UIRefreshControl .例如,refreshControl,作为UITableViewController中的一个属

等级显示小控件

等级控件效果图: 实现方式: 自定义小控件,通过frame来获取它的坐标,然后通过富文本的方式来实现不同文字,由于文字粗体和斜体要同时使用,所以通过富文本实现比较方便: 声明文件: 其中有两个方法,一个是初始化,一个是改变等级需要调用的方法: #import <UIKit/UIKit.h> @interface IDSLevelconView : UIImageView @property (nonatomic, strong) UILabel *levelabel; - (instancet

使用VideoView自定义一个播放器控件

介绍 最近要使用播放器做一个简单的视频播放功能,开始学习VideoView,在横竖屏切换的时候碰到了点麻烦,不过在查阅资料后总算是解决了.在写VideoView播放视频时候定义控制的代码全写在Actvity里了,写完一看我靠代码好乱,于是就写了个自定义的播放器控件,支持指定大小,可以横竖屏切换,手动左右滑动快进快退.好了,下面开始. 效果图 效果图有点卡,我也不知道为啥..... VideoView介绍 这个是我们实现视频播放最主要的控件,详细的介绍大家百度就去看,这里介绍几个常用的方法. 用于

如何在Android实现桌面清理内存简单Widget小控件

如何在Android实现桌面清理内存简单Widget小控件 我们经常会看到类似于360.金山手机卫士一类的软件会带一个widget小控件,显示在桌面上,上面会显示现有内存大小,然后会带一个按键功能来一键清理内存,杀死后台进程的功能,那么这个功能是如何实现的呢,我们今天也来尝试做一个类似的功能的小控件. 效果图: 一.UI部分的编写: 参照Google的文档,首先在建立一个类继承AppWidgetProvider import android.appwidget.AppWidgetProvider

自定义快速查找字母控件

效果图如下: 首先看看布局文件,自定义的控件中包含一个 ListView,用于显示具体的数据内容: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     a

获取 AlertDialog自定义的布局 的控件

AlertDialog自定义的布局 效果图: 创建dialog方法的代码如下: 1 LayoutInflater inflater = getLayoutInflater(); 2 View layout = inflater.inflate(R.layout.dialog, 3 (ViewGroup) findViewById(R.id.dialog)); 4 new AlertDialog.Builder(this).setTitle("自定义布局").setView(layout

关于UITableView选中效果以及自定义cell上的控件响应事件

tableView默认的点击效果是:点击cell:A,出现点击效果,点另一个cell:B的时候,A的点击效果才会消失. 1.对于tableView,比较常用的效果,是点击表格行,出现效果,点击完毕,效果消失 那么就要在代码里做一些设置.代码如下: -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath