设为首页 加入收藏

TOP

iOS IM开发建议(四)UIMenuController 怎么使用(一)
2017-10-13 10:28:26 】 浏览:941
Tags:iOS 开发 建议 UIMenuController 怎么 使用

  这应该是这个系列最后一篇了。我写了很多都不是很好,不过如果不写,那就永远写不好。欢迎大家交流纠错。

 

  UIMenuController,它不像Alert那么不友好,也不像ActionSheet,一定要点击一下;你可以无视它的出现,也可以通过它调用一些设定好的方法。它就长这样:

  

  这个控件是不是很熟悉,微信里面你长按就回出现的一个view。做IM的话,标杆就是wechat了,所以你们的产品怎么会放过它(你)呢。

  先设计一个我们常用的场景:你在聊天界面,长按textView,然后弹出这个菜单,接着你点击了某一个Item。

  聊天页面:tableView + inputBar(就是有输入框的一个view啦)。

  这里面你会用到,tableView的的代理,要实现几个delegate。

 1 #pragma mark -  UITableViewDataSource  &  UITableViewDelegate
 2 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 3     // 有多少条数据
 4     return [dataArray count];
 5 }
 6 
 7 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 8     static NSString * CellIdentifier = @"MessageCell";
 9     MessageCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
10     if (cell == nil) {
11         cell = [MessageCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
12         cell.selectionStyle = UITableViewCellSelectionStyleDefault;
13     }
14     MessageModel * model = [dataArray objectAtIndex:indexPath.row];
15     [cell setMyContent:model];
16     return cell;
17 }
18 
19 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
20     // 这里就用之前写到的的高度计算
21     return #cellHeightFromModelData#;
22 }

  那我们再来看一下cell,cell要做几件事:1、自己的frame要算出来;2、要放好textView或imageView,我这里只说一下textView咯;

  .h 我们要声明一个public的方法,用model来设置cell,减少VC的代码量。 还有一个block,给VC回传textView交互事件。

 1 typedef NS_ENUM(NSInteger,CellOperations) {
 2     TextCopy,
 3     TextDelete,
 4     TextTransfor,
 5     TextCollection,
 6 
 7     ImageCopy,
 8     ImageDelete,
 9     ImageTransfor,
10     ImageCollection,
11 };
12 
13 @property(nonatomic,copy)void (^CellOperation)(MessageModel* message, CellOperations cop);
14 
15 - (void)setMyContent:(MessageModel *)message;

  .m 我们要算自己的高度,textView的高度。还有传递textView的一些事件到VC上。

 1 - (void)setMyContent:(MessageModel *)message {
 2     // 传递参数
 3     // 算高度
 4     // 设置textView的大小 以及背景框的大小
 5 }
 6 
 7 - (void)textViewCallBack:(CellOperations cop){
 8     // 把textView的操作 截获 
 9     // 调用自己的 callBackVC 将操作传递出去
10 }
11 
12 - (void)callBackVC:(CellOperations cop){
13     // 往VC传递操作事件
14 }

  实现上面的3个方法,我们就可以绘制出Cell,并且可以传递textView的操作了。

  接下来,textView。

  .h  这里我们要声明一个Block 给Cell传值

@property(nonatomic,copy)void (^TVOperation)(CellOperations cop);

  .m 这是就要实现UIMenuController

  1 //
  2 //  DisplayTextView.m
  3 // 
  4 //
  5 //  Created by akforsure on 15/12/1.
  6 //  Copyright © 2015年 akforsure. All rights reserved.
  7 //
  8 
  9 #import "DisplayTextView.h"
 10 
 11 @implementation DisplayTextView {
 12     UIMenuController * menu;
 13 }
 14 - (instancetype)initWithFrame:(CGRect)frame {
 15     self = [super initWithFrame:frame];
 16     if(self) {
 17         // 展示用的textView  要不能编辑 最好也不能选取,不然很二的
 18         self.editable = NO;
 19         self.selectable = NO;
 20     }
 21     return self;
 22 }
 23 - (void)showMenu{
 24     // 如果已经出现了 我们就return
 25     if([menu isMenuVisible]) return;
 26     // textView 一定要是第一响应  也要设置为可以是第一响应
 27     [self becomeFirstResponder];
 28     // 设置UIMenuItems  并且添加到页面上
 29     UIMenuItem *menuItem0 = [[UIMenuItem alloc]initWithTitle:@"复制" action:@selector(kCopy:)];
 30     UIMenuItem *menuItem1 = [[UIMenuItem alloc]initWithTitle:@"删除" action:@selector(kDelete:)
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇更新CocoaPods碰到的问题及知识点 下一篇UI进阶 跳转系统设置相关界面的方..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目