iOS开发脚踏实地学习day08-QQ聊天界面
来源:互联网 发布:弘历软件招聘 编辑:程序博客网 时间:2024/06/05 09:26
1.Xcode unknown type name “CGRect”
解决方法;添加#import <UIKit/UIKit.h>
2.得到文本框大小
CGSize testMaxSize = CGSizeMake(150, MAXFLOAT); CGSize textRealSize = [message.text <span style="background-color: rgb(255, 255, 0);">boundingRectWithSize</span>:testMaxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:kBtnSize} context:nil].size;
3.隐藏状态栏
在controller
//隐藏状态栏-(BOOL)prefersStatusBarHidden{ return YES;}
-(UIButton *)textButton{ if (_textButton == nil) { _textButton = [[UIButton alloc] init]; _textButton.backgroundColor = [UIColor grayColor];//正文默认颜色是白色 _textButton.<span style="background-color: rgb(255, 255, 0);">titleLabel</span>.font = [UIFont systemFontOfSize:13.0f];//字体 _textButton.<span style="background-color: rgb(255, 255, 0);">titleLabel.numberOfLines</span> = 0;//自动换行,默认是一行 [self.contentView addSubview:_textButton]; } return _textButton;}
5.#import,#include和@class
http://www.xcoder.cn/index.php/archives/122
#include,可以导入,但不能判断是否重复导入,如果要判断,那么就需要使用#ifdef进行宏判断,非常麻烦!
#import方法是Objective-C引入的,跟#include意义上是一样的,但是可以自行判断是否重复导入,如果已经导入了,那么就忽略掉;
#import和#include导入类有两种方法:#import <>和#import “”。前面一个使用<>尖括号使用时,表示引入的是系统类,会直接到库里查找。如果使用””双引号,表示引入自定义类,系统会先查找当前目录,然后查找path目录,最后再在库中进行查找。
使用@Class+类名,其实只是告诉编译器,这是一个类,而不是加载类头文件,所以编译器不会处理这个类的结构,就不知道类具有的属性和方法。使用@class指令提高了程序效率,原因如上,编译器只需要知道有这样一个类名,而不处理细节。但是,在使用中就不能调用类的方法了,如果使用了,会出现如下错误:
Receiver type ‘Person’ for instance message is a forward declaration
Proerity ‘name’ cannot be found in forward class object ‘Person’
6.代码写tableViewCell
//*********************代码创建cell******************************************************Controller->私有成员@property(nonatomic,strong) MessageCell *cell;->用类方法实例化cellMessageCell *cell = [MessageCell messageCellWithTableView:tableView];View->类方法+(instancetype)messageCellWithTableView:(UITableView *)tableView;//***********************数据**************************************************************Controller->私有成员@property(nonatomic,strong) NSMutableArray *messages;使用懒加载,类方法实例化messages-(NSMutableArray *)messages{ if (_messages == nil) { _messages = [MessageModule messages]; } return _messages;}Module->字典转模型,类方法+(NSMutableArray *)messages;//************************cell的内容和frame************************************************Controller//下面这句话,先得到cell的message,再设置cell的frame,也就是所cell有两个需要得到的一个单元格要显示的内容,和一个单元格的布局。 MessageFrameModule *frameModule = self.messages[indexPath.row]; cell.frameMessage = frameModule;//进入frameMessage的setter方法View->成员@property(nonatomic,strong) MessageFrameModule *frameMessage;->成员的setter方法-(void)setFrameMessage:(MessageFrameModule *)frameMessage{...}
7.隐藏重复的时间
MessageModule加一个属性hideTime,调用setter方法时,作为输入message的参数引入,来修改time的frame。
+(NSMutableArray *)messages{ NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"messages.plist" ofType:nil]]; NSMutableArray *arrayM = [NSMutableArray array]; for (NSDictionary *dict in array) { //以下写法,多次用到frameModule.message,会多次重复调用setter方法,非常不好,而且要改的是_输入的message的hideTime属性,而不是frameModule.message的hideTime属性,不能实现隐藏重复时间。// MessageFrameModule *frameModule = [[MessageFrameModule alloc] init];// frameModule.message = [self messageWithDict:dict];// MessageFrameModule *frameLastModule = [arrayM lastObject];// frameModule.message.hideTime = [frameModule.message.time isEqualToString:frameLastModule.message.time];// frameModule.message.hideTime = YES;// frameModule.message.text = @"病毒病毒";// [arrayM addObject:frameModule];s MessageModule *message = [MessageModule messageWithDict:dict]; MessageFrameModule *lastFrameModule = [arrayM lastObject]; message.hideTime = [message.time isEqualToString:lastFrameModule.message.time]; MessageFrameModule *frameModule = [[MessageFrameModule alloc] init]; frameModule.message = message; [arrayM addObject:frameModule]; } return arrayM; }
//拉伸图片-(UIImage *)resizableImage:(UIImage *)normalImage{ CGFloat top = normalImage.size.width*0.5 -1; CGFloat left = normalImage.size.height*0.5-1; CGFloat bottom = normalImage.size.width*0.5 +1; CGFloat right = normalImage.size.height*0.5 +1; //resizableImageWithCapInsets图片拉伸 //其中Insets这个参数的格式是(top,left,bottom,right),从上、左、下、右分别在图片上画了一道线,这样就给一个图片加了一个框。只有在框里面的部分才会被拉伸,而框外面的部分则不会改变。 UIImage *resizableImage = [normalImage resizableImageWithCapInsets:UIEdgeInsetsMake(top, left, bottom, right)]; return resizableImage;}
9.设置tableView的背景色,一定要清空cell的背景色
cell.backgroundColor = [UIColor clearColor];//把cell的背景颜色去掉,这样tableView的颜色才能显现出来。
self.tableView.backgroundColor = [UIColor colorWithRed:225/255.0f green:225/255.0f blue:225/255.0f alpha:1.0];//注意255/255结果是0,不是小数,所以要加.0f
10.拉伸图片的方法
//拉伸图片-(UIImage *)resizableImage:(UIImage *)normalImage{ CGFloat top = normalImage.size.width*0.5 -1; CGFloat left = normalImage.size.height*0.5-1; CGFloat bottom = normalImage.size.width*0.5 +1; CGFloat right = normalImage.size.height*0.5 +1; UIImage *resizableImage =[normalImage <span style="background-color: rgb(255, 255, 0);">stretchableImageWithLeftCapWidth</span>:left topCapHeight:top];//就是只要给左和上的距离,画出大小为1的框,只有这个框被拉伸,框外面的则都不会。 //resizableImageWithCapInsets图片拉伸 //其中Insets这个参数的格式是(top,left,bottom,right),从上、左、下、右分别在图片上画了一道线,这样就给一个图片加了一个框。只有在框里面的部分才会被拉伸,而框外面的部分则不会改变。// UIImage *resizableImage = [normalImage <span style="background-color: rgb(255, 255, 0);">resizableImageWithCapInsets</span>:UIEdgeInsetsMake(top, left, bottom, right)]; return resizableImage;}
11.键盘事件相关
//键盘frame将变化时的事件-(void)<span style="background-color: rgb(255, 255, 0);">keyboardWillChangeFrame</span>:(NSNotification *)noti{// NSLog(@"%@",noti.userInfo); //把window的背景色改为和tableView一样 self.view.window.backgroundColor = self.tableView.backgroundColor; CGRect frame = [noti.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; //CGAffineTransformMakeTranslation每次都是以最初位置的中心点为起始参照#define kScreenH [[UIScreen mainScreen] bounds].size.height CGFloat animationDuration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue]; [UIView animateWithDuration:animationDuration animations:^{ self.view.transform = CGAffineTransformMakeTranslation(0, frame.origin.y - kScreenH);}];}//当tableView在滚动的时候,结束编辑事件(退出键盘)-(void)<span style="background-color: rgb(255, 255, 0);">scrollViewWillBeginDragging</span>:(UIScrollView *)scrollView{ [self.view endEditing:YES];}
12.往模型上添加新的数据
- (void)addmessage:(NSString *)text type:(MessageModuleType)type{ //新的信息内容 MessageModule *newMessage = [[MessageModule alloc]init]; newMessage.text = text; newMessage.time = @"11"; newMessage.type = type; newMessage.hideTime = NO; //新的frame MessageFrameModule *newFrame = [[MessageFrameModule alloc]init]; newFrame.message = newMessage; //添加到self.messages [self.messages addObject:newFrame]; //刷新数据 [self.tableView reloadData]; //自动上移 NSIndexPath *path = [NSIndexPath indexPathForRow:self.messages.count-1 inSection:0]; [self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionBottom animated:YES]; }
- iOS开发脚踏实地学习day08-QQ聊天界面
- iOS开发脚踏实地学习day09-QQ好友列表
- day08&09-通知机制(QQ聊天界面&QQ好友列表)
- ios-day08-01(模仿QQ聊天界面。ios通知的使用(对键盘状态的监听)、枚举和分类的使用、拉伸图片、计算文本字符串的尺寸
- iOS开发脚踏实地学习day03-九宫图
- iOS开发脚踏实地学习day06--tableView,汽车品牌
- iOS开发脚踏实地学习day07-美团
- iOS开发脚踏实地学习day10-PickerView
- iOS开发脚踏实地学习day11-导航控制器
- iOS开发脚踏实地学习day14-绘图
- iOS开发脚踏实地学习day15-画板
- iOS开发脚踏实地学习day17-彩票
- iOS开发中应用内跳转到QQ聊天界面和指定的联系人聊天
- iOS开发之QQ, 在APP中打开指定qq聊天界面的方法
- iOS 打开指定的QQ聊天界面
- iOS开发之在客服开发之QQ, 在APP中打开指定qq聊天界面的方法
- iOS开发 - 第02篇 - UI进阶 - 04 - QQ聊天界面
- iOS开发脚踏实地学习day04-超级猜图
- 关于AJAX跨域调用web api问题汇总(一)
- 华为3G模块EM770W在LINUX下的驱动安装
- socket编程备忘录
- C++Primer第五版 6.2.1节练习
- import javax.servlet.annotation.*;出错
- iOS开发脚踏实地学习day08-QQ聊天界面
- QT 编程备忘与总结
- Teamviewer退出锁定远程计算机
- 使用U盘安装Debian8.2.0系统图文、视频教程
- 个人学习笔记---linux物理内存空间与虚拟内存空间
- C++Primer第五版 6.2.2节练习
- 落单的数
- 配置自己的项目全站使用SSL连接
- HTML页面跳转的5种方法