iOS 开发中需要注意的小地方

/** 图片长度截取方法 */
- (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect )rect{
    CGImageRef sourceImageRef = [image CGImage];

    CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
    return newImage;
}

SDWebImage清除缓存
#warning 注意: 清除缓存 清除缓存,一般这个清除缓存,在用户的设置里面进行操作. 如果缓存清除了.虽然减少了内存空间.但是,用户就要再请求一边,这样会费流量啊.
     [[SDImageCache sharedImageCache] clearDisk];//清除缓存

CollecttionView
#warning 注意:布局子视图方法
//优势
// layoutAttributes可以获取到当前cell的信息
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
#warning  注意 层级关系...要是先添加imv 的话 我的lable 就被档下去了,文字就不见了
    _lable.frame = CGRectMake(0, layoutAttributes.frame.size.height - 30, layoutAttributes.frame.size.width, 30);
    _lable.backgroundColor = [UIColor blackColor];
    _lable.textColor = [UIColor whiteColor];
    _lable.textAlignment = NSTextAlignmentCenter;
    _lable.alpha = 0.33;

    _imv.frame = CGRectMake(0, 0, layoutAttributes.frame.size.width, layoutAttributes.frame.size.height);

}

#warning 注意MRC情况下 set的写法
- (void)setModel:(Model *)model
{
    if (_model != model) {
        [_model release];
        _model = [model retain];
        //赋值
        self.lable.text = [NSString stringWithFormat:@"%@",model.height];
        [self.imv sd_setImageWithURL:[NSURL URLWithString:model.thumbURL] placeholderImage:[UIImage imageNamed:@"placeHoderImage"]];
    }
}

字符串
#warning 这个比较新鲜, 中文转码(如果网址中有中文,需要中文转码)
//赛选中文 / 中文转码
    NSString *newStr = [str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:str]];

+ (void)musicModelRequest:(MusicModel *)model{
    NSString *str = model.lyric;
#warning 拆分字符串,放到数组中
    NSArray *array = [str componentsSeparatedByString:@"\n"]; //见到/n就把这个字符串放到数组中

    //区分时间与歌词
    NSMutableArray *timeMutableArray = [NSMutableArray array]; //接收时间
    NSMutableArray *lyricMutableArray = [NSMutableArray array]; //接收歌词

    for (NSString *string in array) {

        NSArray *timeAndLyric = [string componentsSeparatedByString:@"]"];//拆分时间与歌词
        [lyricMutableArray addObject:timeAndLyric.lastObject];

        NSArray *timeArray = [timeAndLyric.firstObject componentsSeparatedByString:@"["];//拆分时间
        [timeMutableArray addObject:timeArray.lastObject];

            }

    //赋值
    model.timeArray = [NSArray arrayWithArray:timeMutableArray];
    model.lyricArray = [NSArray arrayWithArray:lyricMutableArray];

}

XIB StorryBorad可视化
#warning 注意: View创建方法...
- (void)loadView
{
    //参数1要加载的XIB文件  参数2文件拥有者   参数3加载选项
    self.htView = [[NSBundle mainBundle] loadNibNamed:@"HTView" owner:self options:nil].firstObject;
    self.view = _htView;
}

#warning 注意: View改文字改属性,在这儿
#import "TextView.h"

@implementation TextView

//改文字,改属性在这儿
- (void)awakeFromNib
{

    self.titleLable.text = @"改文字,改属性在这儿";
}

@end

 #warning 注意:Cell注册.....
//注册
//    [self.tableView registerClass:[SecondViewController class] forCellReuseIdentifier:cell_id_Second];
    [self.tableView registerNib:[UINib nibWithNibName:@"SecondTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:cell_id_Second];

#warning 注意:使用storyBoard关联的类不再使用init方法创建,直接去storyBorad里面找有当前标识符的视图控制器的拖放面板.
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

    UIStoryboard *st = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];//1、先去当前包里找到故事版

    TextViewController *textVC = [st  instantiateViewControllerWithIdentifier:@"testViewController"];//2、根据标示符,在故事版中找到当前视图控制器

    [self.navigationController pushViewController:textVC animated:YES];

}

#warning 获取路径
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSIndexPath *path = [self.tableView indexPathForCell:sender]; //获取路径。。。。。  关键呀.******************************************************

    DetailViewController *detal = segue.destinationViewController;
    detal.string = _array[path.row];
}

TabBar
#warning 图片这块注意:@2x作用,系统自动匹配大小.

#warning  PUS后 隐藏TabBar
- (void)buttonAction:(UIButton *)sender
{
    TextViewController *text = [[[TextViewController alloc] init] autorelease];
    text.hidesBottomBarWhenPushed = YES;PUS页面的时候隐藏tabBar
    [self.navigationController pushViewController:text animated:YES];
//有些应用点击的时候隐藏 导航栏 和 标签栏. 是这样做的
//    self.navigationController.navigationBar.hidden = YES;
//    self.tabBarController.tabBar.hidden = YES;
   //在手势点击事件里设置。根据点击此时,奇偶数进行判断就OK了
}

#pragma mark 当点击标签栏的时候触发此方法
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if (viewController.tabBarItem.badgeValue != nil) {
        viewController.tabBarItem.badgeValue = nil;
  }
    NSLog(@"%ld",tabBarController.selectedIndex);//输出选中下标,做下演示
}

BLOCK
//MRC销毁
- (void)dealloc
{
#warning block 的释放只能使用Block_release() //系统写好的释放方法
    Block_release(_myBlock); //因为block不是一个对象类型不能使用relese,是函数.
    Block_release(_cBlock);//释放
    [_textField release];
    [super dealloc];
    NSLog(@"验证dealloc成功");
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

#warning //block就是一个回调函数,相当于小弟,什么时候用,什么时候调。 哈哈
    //block(函数) 调用
    _myBlock(_textField.text);

#warning  解决循环引用问题    //记住:Block 实现部分不能直接使用属性、实力变量 和 self 去调用; 因为会照成循环引用就是相互持有(不会走dealloc方法),  例如:[self text];这样调用, 错得。循环引用了.

//////////解决循环引用问题演示:
//MRC:
    //第一种写法
    __block SecondViewController *temp = self;

   //第二种写法:
    //__block typeof(self) temp = self;

//ARC:

    //__weak SecondViewController *temp = self;

//实现
    self.cBlock = ^(){
       [temp text];
   };

//调用
    temp.cBlock();
   [self.navigationController popViewControllerAnimated:YES];
}

#import <UIKit/UIKit.h>
typedef void(^MyBlock) (NSString *); //定义有参,无返回值的匿名函数传递字符串; 这是函数
typedef void (^Block)(); //做内存测试

@interface SecondViewController : UIViewController

@property(nonatomic,retain)UITextField *textField;

//MRC: block的语义设置是copy 把block从栈区 拷贝到 堆区 。使用完之后,在dealoc 里面释放.(blcok是函数,函数在栈区)
//ARC:block的语义设置使用strong 即可
@property(nonatomic,copy)MyBlock myBlock; //参数 函数

@property(nonatomic,copy)Block cBlock;

@end

单例
#warning 单例
//创建静态区对象的原因:希望程序运行期间它在程序中一直存在,这样对外界来说,可以随时读取数据.
//我们创建单例使用加号方法的原因是因为:在创建之前,无法存在一个实例对象去调用动态方法来创建它本身
/////劣势:创建多了,会影响性能,内存空间减小。程序会卡.因为是在停留静态区。生命周期,与程序同步。
/////优势:降低耦合性,降低复杂性; 可以全局访问 ;在内存中只有一个对象,节省内存空间;避免频繁的创建销毁对象,提高性能;避免对共享资源的多重占用.

//完整单例手写吧
//+ (instancetype)sharedDaraHandle
//{
//    static DataHandle *dataHandle = nil;
//    static dispatch_once_t onceToken;
//    dispatch_once(&onceToken, ^{
//
//        dataHandle = [[DataHandle alloc] init];
//
//    });
//
//    return dataHandle;
//}

文本高度自适应 + 图片高度自适应 + Cell注意事项
//heightForRowAtIndexPath 这个方法会比cellForRowAtIndexPath先执行,所以我们需要先计算好cell高度,
#warning 注意:注意:注意:只有cell要在layoutSubViews里面布局,因为这个方法最后走,cell需要重用.所以在这里布局.
#warning  注意:最后走这个方法, 还有 图片自适应及文本自适应! 以及layoutSubviews方法里self的宽 和 高 与 初始化里面的不同.
//最后走这个方法
- (void)layoutSubviews
{
    [super layoutSubviews];
#warning 注意:注意:注意:这里千万不能这样赋值   _lable.frame = self.frame 要这样_lable.frame = self.contentView.frame
#warning 注意:注意:注意:这里千万不能这样赋值   _lable.frame = self.frame  要这样_lable.frame = self.contentView.frame
#warning 注意:注意:注意:这里千万不能这样赋值   _lable.frame = self.frame  要这样_lable.frame = self.contentView.frame

//图片高度自适应
    CGFloat height = self.imv.image.size.height * self.contentView.frame.size.width / self.imv.image.size.width;
    self.imv.frame = CGRectMake(0, 0, self.contentView.frame.size.width, height);
    self.imv.backgroundColor = [UIColor grayColor];

   //lable高度自适应

    CGFloat lableHeight = [self myHeight:self.lable.text];
    self.lable.frame = CGRectMake(0, height, self.contentView.frame.size.width, lableHeight);
    self.lable.backgroundColor = [UIColor orangeColor];
    self.lable.numberOfLines = 0;
    self.lable.font = [UIFont systemFontOfSize:17];

    NSLog(@"--------W:%lf  H:%lf",self.frame.size.width,self.frame.size.height);
}

- (CGFloat)myHeight:(NSString *)string
{
    CGRect rect = [string boundingRectWithSize:CGSizeMake(self.frame.size.width, 100000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:17]} context:nil];

    return rect.size.height;
}

#warning  UILable和UIImageView 的用户交互,默认是关闭的

懒加载
#pragma mark 懒加载 重写get方法 //原来这也是懒加载,实质就是get方法(懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小)。)
- (void)addAllViews{
    [self addSubview:self.nameLabel]; //懒加载(用了点语法,才能调用get方法)
    [self addSubview:self.nameTextField]; //懒加载
}
#pragma mark 懒加载 重写get方法
- (UILabel *)nameLabel{
  if (!_nameLabel) {
#warning  注意,创建的时候一定要用self. 点语法创建, 不要_nameLable这样取创建
        self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];
        _nameLabel.text = @"懒加载";
   }
   return _nameLabel;
}

#pragma mark 布局子视图
//布局子视图(从新布局view. 此方法,自动触发,程序最后走这个方法)
- (void)layoutSubviews{
//[UIApplication sharedApplication].statusBarOrientation
    //statusBarOrientation状态栏方向(应用程序)

    if ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft || [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight) {
        [super layoutSubviews];
        _nameTextField.frame = CGRectMake(150, 20, 400, 50);
        _nameTextField.backgroundColor = [UIColor redColor];
        //如果是横屏,XXXX

    }else{
        [super layoutSubviews];
        //如果是竖屏,XXXX
        _nameTextField.frame = CGRectMake(0, 120, 150, 30);
        _nameTextField.backgroundColor = [UIColor whiteColor];

    }

  //(这里是根据应用程序的状态栏方向,来从新布局子时视图)

}

//此方法,绘图的时候,用
- (void)drawRect:(CGRect)rect {
    // Drawing code  绘图时候用
}
从写Model的Get方法 赋值时, 注意: 在if {} 花括号外边进行.
时间: 2024-10-07 06:39:23

iOS 开发中需要注意的小地方的相关文章

iOS开发中一些有用的小代码

1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@&qu

iOS 开发中使用到的小技巧汇总

国庆即将来到,一个小项目也即将完成,把自己在项目中用的一些小技巧写出来,方便查找. 1,去掉分割线--动画设置透明度alpha //去掉tableView的分隔线: self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone; self.tableView.showsVerticalScrollIndicator=NO; 2. 解决cell分割线左边短20px的问题 -(void)viewDidLayoutSubviews{ i

iOS开发中的总结的小技巧,分享给大家!!(待续未完)

这是我在写项目或者学习知识点或者请教人家的时候总结的小技巧 原来是写在笔记本上面的,还是分享给大家了.可能会很乱,觉得对自己有用的就拿走吧,有错漏的地方也求大家指点修正.废话不多说直接来. 1. 监听控件的三种方法 1) addTarget 2)代理 3)通知 2. UITextfiled(文本框)中有一个属性:clearButtonMode 选择 UITextFieldViewModeAlways 就可以在输入多个字符后,右边有个x号点一下全部清除,用户体验会好一点. UITextField

iOS开发中的几个小坑

1.比较NSString时,不要用==,要用isEqualToString:方法 2.不要把动画代码放入viewDidLoad中,而是应该放入viewDidAppear中 3.UIAlertView调用dismissWithClickedbuttonIndex后,alertView:didDismissWithButtonIndex会被代理调用,而alertView:clickedButtonAtIndex不会被调用 4.在switch语句中,若声明了变量,则需要用{}将case语句括起来. 5

iOS开发中容易遗忘的小细节

1.在新建一个子类后不要忘了在storyboard将对应控制器的Class属性设置为这个子类. 2.在创建一个segue后不要忘了给segue设置标识符. 3.添加BOOL属性时不要忘了在括号中写getter = isXXX 4.布局UI控件时不要忘了能填充的控件就填充,方便计算frame 5.常数不要忘记写成静态变量(最好不要用宏,因为宏没有类型,只是简单替换) 6.用if进行判断时不要忘了写成三目运算符 条件 ? 结果1 : 结果2   ,简洁高效. 7. 待补充.

我总结的iOS开发中的几个小坑

1.比较NSString时,不要用==,要用isEqualToString:方法 2.不要把动画代码放入viewDidLoad中,而是应该放入viewDidAppear中 3.UIAlertView调用dismissWithClickedbuttonIndex后,alertView:didDismissWithButtonIndex会被代理调用,而alertView:clickedButtonAtIndex不会被调用 4.在switch语句中,若声明了变量,则需要用{}将case语句括起来. 5

(iOS)开发中收集的小方法

1.颜色转变成图片 - (UIImage *)createImageWithColor:(UIColor *)color {     CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);     UIGraphicsBeginImageContext(rect.size);     CGContextRef context = UIGraphicsGetCurrentContext();     CGContextSetFillColorWithCo

知识点回顾-27个iOS开发中的小技巧

★27个iOS开发中的小技巧 1.不想让TableView显示无用的Cell分割线怎么办? self.tableView.tableFooterView = [[UIView alloc] init]; 2.自定义了leftBarbuttonItem左滑返回手势失效了怎么办? self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:img style:UIBarButtonItemStylePl

全面理解iOS开发中的Scroll View

转自:http://mobile.51cto.com/hot-430409.htm 可能你很难相信,UIScrollView和一个标准的UIView差异并不大,scroll view确实会多一些方法,但这些方法只是UIView一些属性的表面而已.因此,要想弄懂UIScrollView是怎么工作之前,你需要了解 UIView,特别是视图渲染过程的两步. 光栅化和组合 渲染过程的第一部分是众所周知的光栅化,光栅化简单的说就是产生一组绘图指令并且生成一张图片.比如绘制一个圆角矩形.带图片.标题居中的U