iOS开发项目篇—33发微博

iOS开发项目篇—33发微博

一、简单说明

1.发送按钮

当textView的文字发生改变(有内容)的时候,设置导航栏右侧的按钮为可点击的。

说明:监听内容的改变,既可以使用通知来实现,也可以使用代理来实现(下面使用的是代理的方式)

代码说明:

1 #pragma mark-设置代理方法
2 /**
3  *当textView的内容改变的时候,通知导航栏“发送”按钮为可用
4  */
5 -(void)textViewDidChange:(UITextView *)textView
6 {
7     self.navigationItem.rightBarButtonItem.enabled=textView.text.length!=0;
8 }

2.发送微博的接口

查看新浪提供的发送微博的接口:

其中使用了第二个接口就必须要传递图片。

两个接口的参数说明:

(1)发布一条微博信息

(2)上传图片并发布一条微博

提示:参数说明中binary的数据类型对应的时NSData.

3.合理的选择对应的接口

 1 -(void)send
 2 {
 3     //1.发表微博
 4     if (self.photoView.images.count) {
 5         [self sendStatusWithImage];
 6     }else
 7     {
 8         [self sendStatusWithoutImage];
 9     }
10     //2.退出控制器
11     [self dismissViewControllerAnimated:YES completion:nil];
12 }

二、代码实现

说明:新浪开放的接口,只能上传一张图片

实现代码:

YYComposePhotosView.m文件中添加一个获取图片数组的方法

 1 //
 2 //  YYComposePhotosView.m
 3 //
 4
 5 #import "YYComposePhotosView.h"
 6
 7 @implementation YYComposePhotosView
 8
 9 -(void)addImage:(UIImage *)image
10 {
11     UIImageView *imageView=[[UIImageView alloc]init];
12     //设置显示效果
13     imageView.contentMode=UIViewContentModeScaleToFill;
14     //裁剪超出的部分
15 //    imageView.clipsToBounds=YES;
16     imageView.image=image;
17     [self addSubview:imageView];
18 }
19
20 -(void)layoutSubviews
21 {
22     [super layoutSubviews];
23     int count = self.subviews.count;
24     // 一行的最大列数
25     int maxColsPerRow = 4;
26
27     // 每个图片之间的间距
28     CGFloat margin = 10;
29
30     // 每个图片的宽高
31     CGFloat imageViewW = (self.width - (maxColsPerRow + 1) * margin) / maxColsPerRow;
32     CGFloat imageViewH = imageViewW;
33
34     for (int i = 0; i<count; i++) {
35         // 行号
36         int row = i / maxColsPerRow;
37         // 列号
38         int col = i % maxColsPerRow;
39
40         UIImageView *imageView = self.subviews[i];
41         imageView.width = imageViewW;
42         imageView.height = imageViewH;
43         imageView.y = row * (imageViewH + margin);
44         imageView.x = col * (imageViewW + margin) + margin;
45     }
46 }
47
48 -(NSArray *)images
49 {
50     NSMutableArray *images=[NSMutableArray array];
51     for (UIImageView *imageView in self.subviews) {
52         [images addObject:imageView.image];
53     }
54     return images;
55 }
56 @end

YYComposeViewController.m文件进行业务处理

  1 //
  2 //  YYComposeViewController.m
  3 //
  4
  5 #import "YYComposeViewController.h"
  6 #import "YYTextView.h"
  7 #import "YYComposeToolBar.h"
  8 #import "YYComposePhotosView.h"
  9 #import "YYAccountModel.h"
 10 #import "YYAccountTool.h"
 11 #import "AFNetworking.h"
 12 #import "MBProgressHUD+MJ.h"
 13
 14 @interface YYComposeViewController ()<YYComposeToolBarDelegate,UITextViewDelegate,UINavigationControllerDelegate, UIImagePickerControllerDelegate>
 15 @property(nonatomic,weak)YYTextView *textView;
 16 @property(nonatomic,weak)YYComposeToolBar *toolBar;
 17 @property(nonatomic,weak)YYComposePhotosView *photoView;
 18 @end
 19
 20 @implementation YYComposeViewController
 21
 22 #pragma mark-初始化方法
 23 - (void)viewDidLoad
 24 {
 25     [super viewDidLoad];
 26
 27     //设置导航栏
 28     [self setupNavBar];
 29
 30     //添加子控件
 31     [self setupTextView];
 32
 33     //添加工具条
 34     [self setupToolbar];
 35
 36     //添加photoView
 37     [self setupPhotoView];
 38
 39     //写图片代码,把五张图片写入到相册中保存
 40     for (int i=0; i<5; i++) {
 41         NSString *name=[NSString stringWithFormat:@"minion_0%d",i+1];
 42         UIImage *image=[UIImage imageNamed:name];
 43         UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
 44     }
 45
 46 }
 47
 48 -(void)setupPhotoView
 49 {
 50     YYComposePhotosView *photoView=[[YYComposePhotosView alloc]init];
 51     photoView.width=self.textView.width;
 52     photoView.height=self.textView.height;
 53     photoView.y=50;
 54 //    photoView.backgroundColor=[UIColor redColor];
 55     [self.textView addSubview:photoView];
 56     self.photoView=photoView;
 57 }
 58 -(void)setupToolbar
 59 {
 60     //1.创建
 61     YYComposeToolBar *toolBar=[[YYComposeToolBar alloc]init];
 62     toolBar.width=self.view.width;
 63     toolBar.height=44;
 64     self.toolBar=toolBar;
 65     //设置代理
 66     toolBar.delegate=self;
 67
 68     //2.显示
 69 //    self.textView.inputAccessoryView=toolBar;
 70     toolBar.y=self.view.height-toolBar.height;
 71     [self.view addSubview:toolBar];
 72 }
 73
 74
 75 /**
 76  *  view显示完毕的时候再弹出键盘,避免显示控制器view的时候会卡住
 77  */
 78 - (void)viewDidAppear:(BOOL)animated
 79 {
 80     [super viewDidAppear:animated];
 81
 82     // 成为第一响应者(叫出键盘)
 83     [self.textView becomeFirstResponder];
 84 }
 85
 86 #pragma mark-UITextViewDelegate
 87 /**
 88  *  当用户开始拖拽scrollView时调用
 89  */
 90 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
 91 {
 92     [self.view endEditing:YES];
 93 }
 94
 95 //添加子控件
 96 -(void)setupTextView
 97 {
 98     //1.创建输入控件
 99     YYTextView *textView=[[YYTextView alloc]init];
100     //设置垂直方向上拥有弹簧效果
101     textView.alwaysBounceVertical=YES;
102     textView.delegate=self;
103     //设置frame
104     textView.frame=self.view.bounds;
105     [self.view addSubview:textView];
106     self.textView=textView;
107
108     //2.设置占位文字提醒
109     textView.placehoder=@"分享新鲜事···";
110     //3.设置字体(说明:该控件继承自UITextfeild,font是其父类继承下来的属性)
111     textView.font=[UIFont systemFontOfSize:15];
112     //设置占位文字的颜色为棕色
113     textView.placehoderColor=[UIColor lightGrayColor];
114
115     //4.监听键盘
116     //键盘的frame(位置即将改变),就会发出UIKeyboardWillChangeFrameNotification通知
117     //键盘即将弹出,就会发出UIKeyboardWillShowNotification通知
118     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(KeyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
119     //键盘即将隐藏,就会发出UIKeyboardWillHideNotification通知
120     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(KeyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
121 }
122
123 -(void)dealloc
124 {
125     [[NSNotificationCenter defaultCenter]removeObserver:self];
126 }
127
128 #pragma mark-设置代理方法
129 /**
130  *当textView的内容改变的时候,通知导航栏“发送”按钮为可用
131  */
132 -(void)textViewDidChange:(UITextView *)textView
133 {
134     self.navigationItem.rightBarButtonItem.enabled=textView.text.length!=0;
135 }
136 #pragma mark-键盘处理
137 /**
138  *键盘即将弹出
139  */
140 -(void)KeyboardWillShow:(NSNotification *)note
141 {
142     YYLog(@"%@",note.userInfo);
143     //1.键盘弹出需要的时间
144     CGFloat duration=[note.userInfo [UIKeyboardAnimationDurationUserInfoKey] doubleValue];
145
146     //2.动画
147     [UIView animateWithDuration:duration animations:^{
148         //取出键盘的高度
149         CGRect keyboardF=[note.userInfo [UIKeyboardFrameEndUserInfoKey] CGRectValue];
150         CGFloat keyboardH=keyboardF.size.height;
151         self.toolBar.transform=CGAffineTransformMakeTranslation(0, -keyboardH);
152     }];
153 }
154
155 /**
156  *键盘即将隐藏
157  */
158 -(void)KeyboardWillHide:(NSNotification *)note
159 {
160     //1.键盘弹出需要的时间
161     CGFloat duration=[note.userInfo [UIKeyboardAnimationDurationUserInfoKey] doubleValue];
162     //2.动画
163     [UIView animateWithDuration:duration animations:^{
164         self.toolBar.transform=CGAffineTransformIdentity;
165     }];
166 }
167
168 //设置导航栏
169 -(void)setupNavBar
170 {
171     self.title=@"发消息";
172     self.view.backgroundColor=[UIColor whiteColor];
173     self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"取消" style:UIBarButtonItemStyleBordered target:self action:@selector(cancel)];
174     self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"发送" style:UIBarButtonItemStyleBordered target:self action:@selector(send)];
175     self.navigationItem.rightBarButtonItem.enabled=NO;
176 }
177
178 -(void)send
179 {
180     //1.发表微博
181     if (self.photoView.images.count) {
182         [self sendStatusWithImage];
183     }else
184     {
185         [self sendStatusWithoutImage];
186     }
187     //2.退出控制器
188     [self dismissViewControllerAnimated:YES completion:nil];
189 }
190
191 /**
192  *  发送带图片的微博
193  */
194 -(void)sendStatusWithImage
195 {
196     //1.获得请求管理者
197     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
198
199     //2.封装请求参数
200     NSMutableDictionary *params=[NSMutableDictionary dictionary];
201     params[@"access_token"] =[YYAccountTool accountModel].access_token;
202     params[@"status"]=self.textView.text;
203
204     //3.发送POST请求
205 //    [mgr POST:@"https://api.weibo.com/2/statuses/update.json" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary*statusDict) {
206 //
207 //    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
208 //
209 //    }];
210     [mgr POST:@"https://upload.api.weibo.com/2/statuses/upload.json" parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
211 #warning 目前新浪提供的发微博接口只能上传一张图片
212         //取出图片
213         UIImage *image=[self.photoView.images firstObject];
214         //把图片写成NSData
215         NSData *data=UIImageJPEGRepresentation(image, 1.0);
216         //拼接文件参数
217         [formData appendPartWithFileData:data name:@"pic" fileName:@"status.jpg" mimeType:@"image/jpeg"];
218
219     } success:^(AFHTTPRequestOperation *operation, id responseObject) {
220         [MBProgressHUD showSuccess:@"发表成功"];
221     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
222         [MBProgressHUD showError:@"发表失败"];
223     }];
224 }
225
226 /**
227  *  发送不带图片的微博
228  */
229 -(void)sendStatusWithoutImage
230 {
231
232     //1.获得请求管理者
233     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
234
235     //2.封装请求参数
236     NSMutableDictionary *params=[NSMutableDictionary dictionary];
237     params[@"access_token"] =[YYAccountTool accountModel].access_token;
238     params[@"status"]=self.textView.text;
239
240     //3.发送POST请求
241     [mgr POST:@"https://api.weibo.com/2/statuses/update.json" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary*statusDict) {
242         [MBProgressHUD showSuccess:@"发表成功"];
243     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
244         [MBProgressHUD showError:@"发表失败"];
245     }];
246
247     //4.关闭发送微博界面
248 //    [self dismissViewControllerAnimated:YES completion:nil];
249 }
250 -(void)cancel
251 {
252     [self dismissViewControllerAnimated:YES completion:nil];
253 //    [email protected]"测试";
254 }
255
256
257 #pragma mark-YYComposeToolBarDelegate
258 -(void)composeTool:(YYComposeToolBar *)toolbar didClickedButton:(YYComposeToolbarButtonType)buttonType
259 {
260     switch (buttonType) {
261         case YYComposeToolbarButtonTypeCamera://照相机
262             [self openCamera];
263             break;
264
265         case YYComposeToolbarButtonTypePicture://相册
266             [self openAlbum];
267             break;
268
269         case YYComposeToolbarButtonTypeEmotion://表情
270             [self openEmotion];
271             break;
272
273         case YYComposeToolbarButtonTypeMention://提到
274             YYLog(@"提到");
275             break;
276
277         case YYComposeToolbarButtonTypeTrend://话题
278             YYLog(@"打开话题");
279             break;
280
281         default:
282             break;
283     }
284 }
285
286 /**
287  *  打开照相机
288  */
289 -(void)openCamera
290 {
291     //如果不能用,则直接返回
292     if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) return;
293
294     UIImagePickerController *ipc=[[UIImagePickerController alloc]init];
295     ipc.sourceType=UIImagePickerControllerSourceTypeCamera;
296     ipc.delegate=self;
297     [self presentViewController:ipc animated:YES completion:nil];
298
299 }
300 /**
301  *  打开相册
302  */
303 -(void)openAlbum
304 {
305     //如果不能用,则直接返回
306     if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return;
307
308     UIImagePickerController *ipc=[[UIImagePickerController alloc]init];
309     ipc.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
310     ipc.delegate=self;
311     [self presentViewController:ipc animated:YES completion:nil];
312 }
313 /**
314  *  打开表情
315  */
316 -(void)openEmotion
317 {
318
319 }
320
321 #pragma mark-UIImagePickerControllerDelegate
322 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
323 {
324     [picker dismissViewControllerAnimated:YES completion:nil];
325     //1.取出选取的图片
326     UIImage *image=info[UIImagePickerControllerOriginalImage];
327
328     //2.添加图片到相册中
329     [self.photoView addImage:image];
330 }
331 @end

效果:

(1)发送纯文字微博

  

(2)发送带图片的微博信息

   

(3)使用账号登录到新浪官方查看发送的测试数据

iOS开发项目篇—33发微博

时间: 2024-10-27 19:04:52

iOS开发项目篇—33发微博的相关文章

iOS开发项目篇—36封装微博业务

iOS开发项目篇—36封装微博业务 一.简单说明 1.请求参数面向模型 2.请求结果面向模型 3.对控制器来说应该屏蔽业务细节.不让控制器关心(知道)业务细节,它只需要知道自己在做某个业务 @通过一个专门的业务处理类:处理微博业务细节 说明: 业务:加载新的微博首页数据 实现:给新浪服务器发送一个GET请求 业务:加载更多的首页微博数据 实现1:给新浪服务器发送一个GET请求 实现2:去沙盒中加载以前离线缓存的微博数据  二.实现 1.新建一个微博业务处理类,继承自NSObject 微博业务处理

iOS开发项目篇—39获取用户未读的微博信息(信息提醒)

iOS开发项目篇—39获取用户未读的微博信息(信息提醒) 一.简单说明 1.实现效果       2.实现 (1)新建一个类,封装请求 查看新浪官方要求的请求参数 该类中的代码设计 YYUnreadCountParam.h文件 1 // YYUnreadCountParam.h 2 //封装请求参数的类 3 4 #import "YYBaseParam.h" 5 6 @interface YYUnreadCountParam : YYBaseParam 7 /**uid true in

iOS开发项目篇—31提示最新微博数

iOS开发项目篇—31提示最新微博数 一.简单说明 1.导入图片素材 2.关于提示条的位置分析 原本的显示情况: 说明:滚动tableView对它没有任何的影响,可以知道提示条的父控件不应该是tableView 加入提示条之后的情况:     解决方案: 说明: (1)导航条是导航控制器的view子控件,可以把提示条添加到导航控制器的view上,当刷新的时候,有view调整提示条的位置. (2)关于改变y的值以及transform的选择,如果是动画执行完成之后需要回复到以前的位置,那么建议使用t

iOS开发项目篇—28自定义UITextView

iOS开发项目篇—28自定义UITextView 一.简单说明 1.要实现的效果 2.分析 (1)UITextField 1.最多只能输入一行文字 2.能设置提醒文字(placehoder) 3.不具备滚动功能 (2)UITextView 1.能输入N行文字(N>0) 2.不能设置提醒文字(没有placehoder属性) 3.具备滚动功能 需求:技能输入多行文字,又具备文字提醒功能. 这里选择自定义一个类,让其继承自UITextView类,为其添加一个设置文字提醒的功能. 二.实现 自定义UI控

iOS开发项目篇—27自定义UITabBar

iOS开发项目篇—27自定义UITabBar 一.自定义 思路: (1)新建一个继承自UITabBar的类,自定义一个UITabBar (2)用自定义的UITabBar换掉系统的UItabBar(使用了KVC) (3)监听控制器的切换,只要控制器一切换,就调用代理方法强制重新布局子控件(内部会调用layoutSubviews). YYTabBar.m文件代码: 1 // 2 // YYTabBar.m 3 // 4 5 #import "YYTabBar.h" 6 7 @interfa

iOS开发项目篇—37封装其他业务

iOS开发项目篇—37封装其他业务 一.简单说明 项目分层的步骤: (1)新建一个模型类封装请求参数 (2)新建一个模型类封装请求结果(返回结果) (3)新建一个业务类封装专一的业务 二.获得用户信息业务的封装 (1)新建一个模型类封装请求参数 查看新浪官方获取用户信息需要哪些请求参数: 封装请求参数的类的代码设计: YYUserInfoParam.h文件 1 // 2 // YYUserInfoParam.h 3 // 4 5 #import <Foundation/Foundation.h>

iOS开发项目篇—46时间和来源的处理(cell的复用问题)

iOS开发项目篇—46时间和来源的处理(cell的复用问题)一.简单说明 1.存在的问题:             2.问题描述: 刷新微博界面后,展示的最新的微博数据时间显示为“刚刚”,在项目中对时间进行设计的时候,如果是在1分钟之内发表的,那么显示为“刚刚”.查看后面的微博数据后,回过头来(1分钟已经过去了),此时之前显示为“刚刚”的微博,应该显示XX分钟以前,确实显示了,但是时间的frame不正确(此时的frame=="刚刚"两个字的frame). 提示:cell的复用问题,为了

iOS开发项目篇—38深层重构

iOS开发项目篇—38深层重构 一.简单说明 说明:可以发现每个工具类,内部方法的代码长相都差不多,可以考虑再抽取出一个处理业务的公共的工具类,让其他的业务类继承自这个工具类,降低代码的冗余度. 1.新建一个工具类 该基础业务处理工具类中的代码设计: YYBaseTool.h文件 1 // 2 // YYBaseTool.h 3 4 //最基本的业务工具类 5 6 #import <Foundation/Foundation.h> 7 8 @interface YYBaseTool : NSO

iOS开发项目篇—35封装网络请求

iOS开发项目篇—35封装网络请求 一.简单说明 1.分析项目对网路请求(AFN框架)的依赖 项目中,多个控制器都使用了AFN框架发送网络请求,如果AFN2.0存在重大BUg,或者是升级至3.0版本,那么对于整个项目都是及其危险的,所有用到AFN的地方都需要做出相应的修改. 另外,如果现在要求不再使用AFN框架,而是使用一个新的框架,那么有关AFN的依赖所关联的所有代码都需要重新来过. 如果把afn这个第三方框架从项目中删除的话,那么项目就相当于作废了,这就是项目对第三方框架的强依赖的体现. 说