viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear四种方法的介绍以及用法
viewDidLoad-加载视图
viewWillAppear-UIViewController对象的视图即将加入窗口时调用;
viewDidApper-UIViewController对象的视图已经加入到窗口时调用;
viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;
viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;
viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;
viewDidUnload-当内存过低,释放一些不需要的视图时调用。
相关的用法
首先介绍一下怎么在Xcode找到对应的方法(针对小白)
对着viewDidLoad按住command键
能够根据图片的数量自动显示对应的view
效果图
代码实现
//首先根据图片的数量返回对应的size
-(CGSize)photosSIzetocount:(int)count
{
//设置图片的宽高为64,间距为10
//求行数
int rows = 0;
if(count%3==0){
rows = count / 3;
}else{
rows = count / 3 + 1;
}
CGFloat photosH = rows * 75 + (rows – 1) * 10;
//求列数
int cols = (count>2)?3:count;
CGFloat photosW = cols * 75 + (cols – 1) * 10;
return CGSizeMake(photosW, photosH);
}
//根据图片的数量来创建足够多的imageView以及隐藏多余的imageView
-(void)setPhotosArray:(NSArray *)photosArray
{
_photosArray = photosArray;
//先把数组的总数拿出来,那么就不用经常重新调用get方法
int count = (int) photosArray.count;
//创建足够多的imageView来显示图片
while (self.subviews.count<count) {
UIImageView *imageV = [[UIImageView alloc] init];
[self addSubview:imageV];
}
//给设置好的imageV添加图片
for (int i=0; i<self.subviews.count; i++) {
UIImageView *photoV = self.subviews[i];
if(i<count){
photoV.hidden = NO;
//设置图片
NSDictionary *dict = _photosArray[i];
NSString *imageUrl = dict[@”thumbnail_pic”];
NSData *imagedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:imageUrl]];
photoV.image = [UIImage imageWithData:imagedata];
}else{
//多余的imageV就把它隐藏
photoV.hidden = YES;
}
}
}
//设置子控件的尺寸
-(void)layoutSubviews
{
[super layoutSubviews];
//先把数组的总数拿出来,那么就不用经常重新调用get方法
int count = (int) _photosArray.count;
for (int i=0; i<count; i++) {
UIImageView *photoV = self.subviews[i];
//设置图片的宽高为64,间距为10
int col = i%3;
CGFloat photoX = col * (75+10);
int row = i/3;
CGFloat photoY = row *(75+10);
photoV.frame = CGRectMake(photoX, photoY, 75, 75);
}
}
//计算高度
-(CGSize)sizeWithText:(NSString *)text font:(UIFont *)font maxW:(CGFloat)maxW
{ //创建一个空字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
//设置字号的大小
dict[NSFontAttributeName] = font;
//设置*大宽度和*大高度
CGSize maxSize = CGSizeMake(maxW, 1000);
return [text boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading | NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
}
因为plist文件里面保存的不能是.json,所以要将它进行转换
//.json转成字符串
//dict里面装着的是.json数据
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&parseError];
NSString *str = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
//解析数据
//字符串转成.json
NSData *jsonData = [str dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *kdict = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:
只需要添加三行代码就可以解决
//数据刷新时界面不会跳动
self.tableView.estimatedRowHeight = 0;
self.tableView.estimatedSectionFooterHeight = 0;
self. tableView.estimatedSectionHeaderHeight = 0;
NSRange range = NSMakeRange(0, collectArray.count);
NSIndexSet *nsindex = [NSIndexSet indexSetWithIndexesInRange:range];
[dataArray insertObjects:collectArray atIndexes:nsindex];
代码
//1.0是指图片压缩时不失真
//image转成string
NSData *data = UIImageJPEGRepresentation(image, 1.0f);
NSString *encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
//string转成image
NSData *_decodedImageData = [[NSData alloc] initWithBase64Encoding:_encodedImageStr];
UIImage *_decodedImage = [UIImage imageWithData:_decodedImageData];
效果图
代码
//自己创建一个view(这里我用的是自己定义的picView,换成UIView那些也是一样的)
picView *picV = [[picView alloc] init];
picV.frame = CGRectMake(0, 0, self.textView.bounds.size.width, 35);
picV.delegate = self;
//inputAccessoryView这个是设置填充键盘顶部的内容
//设置在textView是因为键盘是textView叫出的
self.textView.inputAccessoryView= picV;
layoutSubviews在以下情况下会被调用
1、init初始化不会调用layoutSubviews。
2、addSubview会调用layoutSubviews。
3、设置view的Frame会调用layoutSubviews,前提是frame的值前后发生了变化。
4、滚动一个UIScrollView会调用layoutSubviews。
5、旋转Screen会调用父UIView上的layoutSubviews事件。
6、改变一个UIView大小的时候也会调用父UIView上的layoutSubviews事件。
7、直接调用setLayoutSubviews。
由于UITextView没有占位字的属性,但如果想要做到像UITextField那样能够显示占位字,那么我们就需要自定义一个类继承于UITextView,在新创建的类上添加占位字属性
效果图
方法介绍
新建一个类继承于UITextView,在新建类的.h文件创建占位字属性(.h文件创建的原因在于要被其他类调用,如果在.m文件里设置那这个属性只是这个类私有的)
在这个新建类的.m文件里完善它的方法
#import “placeholderview.h”
@implementation placeholderview
//这个方法是对象初始化时都会调用的
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self){
//文本内容改变时监听通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textchange) name:UITextViewTextDidChangeNotification object:self];
}
return self;
}
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
-(void)textchange
{
//重新绘制
[self setNeedsDisplay];
}
//如果要完善自定义控件,就是你在外面改属性时就会显示出相应的东西,所以就要做到重写set方法
-(void)setPlaceColor:(UIColor *)placeColor
{
_placeColor = [placeColor copy];
//重新绘画一次
[self setNeedsDisplay];
}
-(void)setPlaceholder:(NSString *)placeholder
{
_placeholder = [placeholder copy];
//重新绘画一次
//setNeedsDisplay这个方法不是一设置就会调用,它是收集好全部信息再重新画一次
//setNeedsDisplay这个方法是会自动去调用drawRect这个方法的
[self setNeedsDisplay];
}
//这个方法每次执行会先把之前绘制的去掉
-(void)drawRect:(CGRect)rect
{
if(!self.hasText){
//文字的属性
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSFontAttributeName] = self.font;
dict[NSForegroundColorAttributeName] = self.placeColor;
//画文字(rect是textView的bounds)
NSLog(@”%f”,rect.size.width);
CGRect textRect = CGRectMake(5, 8, rect.size.width, rect.size.height);
[self.placeholder drawInRect:textRect withAttributes:dict];
}
}