文档章节

iOS tips随笔

哈哈8066
 哈哈8066
发布于 2015/03/06 20:31
字数 1658
阅读 138
收藏 0

定义时候用到的strong weak copy assign等

/**
 copy : NSString\NSMutableString\block
 weak : 代理\UI控件
 strong : 其他OC对象
 assign : 基本数据类型(int\float)\枚举\结构体
 */

 

代理(delegate)用weak,delegate。 @property(nonatomic,weak) id delegate;
bool类型用assign。@property(nonatomic,assign) bool xxx ;
NSString用copy。@property(nonatomic,copy) NSString * xxx;

UI控件用weak:weak是弱指针,alloc的时候要先用强指针指着他。例如:(
    @property(nonatomic,weak) UILable *xxx ;

    UILable *xxx = [[UILable alloc] init];
    [self.contentView addSubview:xxx];
    self.xxx = xxx;


NSArray和NSMutableArray用strong,@property(nonatomic,strong) NSArray * xxx;
对象类型(class)用strong.
CGRect用assign,readonly。@property(nonatomic,assign,readonly) CGRect xxx ;

NSOperationQueue用strong。@property(nonatomic,strong) NSOperationQueue * xxx ;

——————————————————————————————————————————————————————————————————————————————

 

添加子控件


[self.contentView addSubview:xxxView]

——————————————————————————————————————————————————————————————————————————————

延迟动画(gcd实现)


延迟动画    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(<#delayInSeconds#> * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        <#code to be executed after a specified delay#>

});

-(void)awakeFromNib{} 当xib文件加载好以后执行的方法

——————————————————————————————————————————————————————————————————————————————

获取主屏幕的宽度


[UIScreen mainScreen].bounds.size.width; 主屏幕的宽度。

——————————————————————————————————————————————————————————————————————————————

获取xib控件


xib向class拖线,应加上:
@interface MJAppCell()

@end

——————————————————————————————————————————————————————————————————————————————

测试注释预处理


#define MJLog(…) NSLog(__VA_ARGS__)
——————————————————————————————————————————————————————————————————————————————

UIApplication


UIApplication有个功能十分强大的openURL:方法
- (BOOL)openURL:(NSURL*)url;

openURL:方法的部分功能有
打电话
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"]];

发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];

发邮件
[app openURL:[NSURL URLWithString:@"mailto://12345@qq.com"]];

打开一个网页资源
[app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];

打开其他app程序

———————————————————————————————————————————————————————

“UISwitch”和“监听文本框改变”

1.UISwitch
* UISwitch继承自UIControl,因此也能像UIButton一样监听一些事件,比如状态改变事件
* UISwitch可以通过拖线监听状态改变
* UISwitch可以通过addTarget:...方法监听状态改变
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
// 其中controlEvents参数传递的是:UIControlEventValueChanged(值改变事件)

/**
*  当一个switch的状态改变,另一个也跟着改
*/
- (IBAction)rememberPwdChanged {
    if (self.rememberPwdSwitch.isOn == NO) {    //on的getter方法是isOn, 具体如下:
//        self.autoLoginSwitch.on = NO;           //@property(nonatomic,getter=isOn) BOOL on;
        [self.autoLoginSwitch setOn:NO animated:YES];   //改变的时候加动画 duang
    }
}
- (IBAction)autoLoginChanged {
    if (self.autoLoginSwitch.isOn) {
//        self.rememberPwdSwitch.on = YES;
        [self.rememberPwdSwitch setOn:YES animated:YES];
    }
}



2.监听文本框的文字改变
* 一个文本输入框的文字发生改变时,文本输入框会发出一个UITextFieldTextDidChangeNotification通知
* 因此通过监听通知来监听文本输入框的文字改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:textField];
// textField文本输入框的文字改变了,就会调用self的textChange方法

 

———————————————————————————————————————————————————————

隐藏键盘

方法一:
    //1, 关闭键盘
    [[[UIApplication sharedApplication] keyWindow] endEditing:YES];

    //[self.view endEditing:YES];

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.view endEditing:YES];
}

 


方法二:
   //2, 关闭键盘

    //[self.xxx resignFirstResponder];//谁呼出的键盘,谁退出(不当第一响应者)
    [[self findFirstResponderBeneathView:self] resignFirstResponder];

- (IBAction)endKeyboard;    //退出键盘

- (IBAction)endKeyboard {
     [[[UIApplication sharedApplication] keyWindow] endEditing:YES];
}

 同样,当想呼出键盘的时候,就让空间成为第一响应者(becomeFirstResponder)

[self.xxx becomeFirstResponder];

———————————————————————————————————————————————————————

隐藏tableview分割线   

//隐藏tableview分割线
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

 

———————————————————————————————————————————————————————

归档获取文件路径

// 文件路径
#define taoContactsFilepath [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"contacts.data"]

———————————————————————————————————————————————————————

Modal的使用

1、跳转:

    [self presentViewController:nav animated:YES completion:^{
        NSLog(@"展示TwoViewController完毕.......");
    }];

2、跳回:

[self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"关闭TwoViewController....");
    }];

———————————————————————————————————————————————————————

网络访问常用代码格式

NSURL *url = nil;
    NSURLRequest *requst = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10.0f];
    // 新建一条线程,连接到网络,并等待返回数据
    [NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
       
        // data就是从网络返回的数据
        // 对data处理
        // 重新回到主线程工作
        dispatch_async(dispatch_get_main_queue(), ^{
            // 更新UI
        });
    }];

 

———————————————————————————————————————————————————————

版本适配

[[UIDevice currentDevice].systemVersion floatValue] >= 7.0;

———————————————————————————————————————————————————————

计算按钮尺寸为 按钮字体的尺寸

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIButton *writePravateMessage = [[UIButton alloc] init];
    [writePravateMessage setTitle:@"写私信" forState:UIControlStateNormal];
    [writePravateMessage setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
    [writePravateMessage setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
    writePravateMessage.titleLabel.font = [UIFont systemFontOfSize:15];
    writePravateMessage.backgroundColor = [UIColor greenColor];
    
    //计算按钮尺寸为 按钮字体的尺寸
    //writePravateMessage.size = [writePravateMessage.currentTitle 
                                    sizeWithFont:writePravateMessage.titleLabel.font];
   
     writePravateMessage.size = [self 
                                sizeWithFontOrAttributes:writePravateMessage.titleLabel.font 
                                buttonVc:writePravateMessage.currentTitle];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
                                                initWithCustomView:writePravateMessage];
}

/**
 iOS7以上用sizeWithAttributes,以下用sizeWithFont
 */
- (CGSize) sizeWithFontOrAttributes:(UIFont *) font buttonVc:(id) obj{
    if (iOS7) {
        NSDictionary *fontWithAttributes = @{NSFontAttributeName:font};
        return [obj sizeWithAttributes:fontWithAttributes];
    } else {
        return [obj sizeWithFont:font];
    }
}

 

———————————————————————————————————————————————————————

当前版本

NSString *lastVersion = KCFBundleVersionKey;

———————————————————————————————————————————————————————

 

UILable显示边框

1. 添加框架 QuartzCore.framework  

2. 引入头文件#import "QuartzCore/QuartzCore.h"

3. uilable.layer.borderColor = [UIColor lightGrayColor].CGColor;
  uilable.layer.borderWidth = 2.0;

———————————————————————————————————————————————————————

一个控件用肉眼看不见,有哪些可能

/*
 一个控件用肉眼看不见,有哪些可能
 1.根本没有创建实例化这个控件
 2.没有设置尺寸
 3.控件的颜色跟父控件的背景色一样(实际上已经显示了,只不过用肉眼看不见)
 4.透明度alpha <= 0.01
 5.hidden = YES
 6.没有添加到父控件中
 7.被其他控件挡住了
 8.位置不对
 9.父控件发生了以上情况
 10.特殊情况
 * UIImageView没有设置image属性,或者设置的图片名不对
 * UILabel没有设置文字,或者文字颜色和跟父控件的背景色一样
 * UITextField没有设置文字,或者没有设置边框样式borderStyle
 * UIPageControl没有设置总页数,不会显示小圆点
 * UIButton内部imageView和titleLabel的frame被篡改了,或者imageView和titleLabel没有内容
 * .....
 
 添加一个控件的建议(调试技巧):
 1.最好设置背景色和尺寸
 2.控件的颜色尽量不要跟父控件的背景色一样
 */

———————————————————————————————————————————————————————

程序启动会自动加载的图片

/*
 1.程序启动会自动加载叫做Default的图片
 1> 3.5inch 非retain屏幕:Default.png
 2> 3.5inch retina屏幕:Default@2x.png
 3> 4.0inch retain屏幕: Default-568h@2x.png

 2.只有程序启动时自动去加载的图片, 才会自动在4inch retina时查找-568h@2x.png
 */

——————————————————————————————————————————————————————————————————————————————————————————————

程序设置了UINavigationController,scrollview里面的视图有全部下移若干像素 解决方法

//自动调整滚动视图插入
self.automaticallyAdjustsScrollViewInsets = NO;

——————————————————————————————————————————————————————————————————————————————————————————————

NSData、 UIImage、ALAsset之间的关系和转化

//NSData转换为UIImage
NSData *imageData = [NSData dataWithContentsOfFile: imagePath];
 UIImage *image = [UIImage imageWithData: imageData];
//UIImage转换为NSData
NSData *imageData = UIImagePNGRepresentation(aimae);
//ALAsset提取UIImage
       UIImage *tempImg=[UIImage imageWithCGImage:asset.defaultRepresentation.fullScreenImage];

 

——————————————————————————————————————————————————————————————————————————————————————————————

UIButton超出UIView边界不可点击

当按钮超过了父视图范围,点击是没有反应的。因为消息的传递是从最下层的父视图开始调用hittest方法。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {  
    UIView *view = [super hitTest:point withEvent:event];  
    return view;  
}  

当存在view时才会传递对应的event,现在点击了父视图以外的范围,自然返回的是nil。所以当子视图(比如按钮btn)因为一些原因超出了父视图范围,就要重写hittest方法,让其返回对应的子视图,来接收事件。


- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {  

    UIView *view = [super hitTest:point withEvent:event];  

    if (view == nil) {  

    CGPoint tempoint = [btn convertPoint:point fromView:self];  

        if (CGRectContainsPoint(btn.bounds, tempoint))   

    {  

          view = btn;  

        }  

     }             

    return view;  

}  

 

——————————————————————————————————————————————

UIWebView 快速创建

UIWebView * webView = [[UIWebView alloc] init];
    webView.frame = CGRectMake(0, 20,
                               [UIScreen mainScreen].bounds.size.width,
                               [UIScreen mainScreen].bounds.size.height - 20);
    
    webView.backgroundColor = [UIColor lightGrayColor];

    [self.view addSubview:webView];
    
    NSURL *url = [NSURL URLWithString:@"urlString"];
    
    NSURLRequest * request = [NSURLRequest requestWithURL:url];
    
    [webView loadRequest:request];

 

——————————————————————————————————————————————

根据文字内容设置大小位置

CGRect rectToFit = [text boundingRectWithSize:CGSizeMake(240.0f, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:12.0f]} context:nil];

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: Order Of The Engineer
下一篇: iOS电量测试实践
哈哈8066
粉丝 3
博文 43
码字总数 11565
作品 0
浦东
程序员
私信 提问
iOS 开发之一些著名开发者博客

国内 王巍 王巍目前在日本横滨任职于 LINE。工作内容主要进行 Unity3D 开发,8小时之外经常进行 iOS/Mac 开发。他的陈列柜中已有多款应用,其中番茄工作法工具非常棒。 博客 池建强 池建强,...

maskmale
02/25
0
0
苹果向开发者发布 iOS 8 Beta 4,第四个测试版

苹果今天向开发者发布了 iOS 8 第四个测试版 Beta 4,距离第三个测试版发布相隔两周。已经安装 iOS 8的用户可以通过 OTA 在线进行更新,此外开发者也可以从网站下载 iOS 8 Beta 4。iOS 8加入...

oschina
2014/07/22
1K
0
【Chrome】Chrome-devtools:对ios-safari移动端的H5页面进行调试(ios-webkit-debug-proxy)

说在前头 要看干货的,可跳过该“说在前头”章节 该类文章,百度上“一挖一麻袋”,但说句不好听的,“一个能打的都没有”,总结如下: scoop:win7下,搞这个都烦的一批,到最后“scoop ins...

清一色天空
07/02
0
0
新鲜出炉的腾讯音乐iOS面试题

前言 为防止背题,大部分题目不设标准答案,重点考察面试者的基础知识和思维逻辑,答案的提示见后面。 正文 题目1、举例两个遇到过印象深刻的外网Crash,并介绍如何发现、定位、解决; 题目2...

落影loyinglin
07/16
0
0
iphone开发资源汇总

学习过程当中查找到的资料,做一个记录,以便更多朋友查看。 开发的过程有时候是简单的,因为我们可以站在巨人的肩上,跳得更高,走得更远。 如何用Facebook graphic api上传视频: http://d...

长平狐
2012/08/13
466
0

没有更多内容

加载失败,请刷新页面

加载更多

Ubuntu16.04下安装docker

[TOC] 本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队的理想选择。 1. 开始安装 1.1 由于...

豫华商
今天
10
0
使用XShell工具密钥认证登录Linux系统

如果你是一名Linux运维,那么Linux服务器的系统安全问题,可能是你要考虑的,而系统登录方式有两种,密码和密钥。哪一种更加安全呢? 无疑是后者! 这里我为大家分享用Xshell利器使用密钥的方...

dragon_tech
今天
8
0
day178-2018-12-15-英语流利阅读-待学习

“真蛛奶茶”了解一下?蜘蛛也会产奶了 Lala 2018-12-15 1.今日导读 “蛋白质含量是牛奶的 4 倍,并有着更低的脂肪和含糖量”,听起来诱人又美味的并不是羊奶或豆奶,而是你可能打死都想不到...

飞鱼说编程
今天
12
0
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents

场景重现 npm install --verbose 安装依赖的时,出现如下警告 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules\fsevents):npm WARN notsup SKIPPING OPTIONA......

taadis
今天
2
0
OSChina 周六乱弹 —— 你一口我一口多咬一口是小狗

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文 :分享Roy Orbison的单曲《She's a Mystery to Me》 《She's a Mystery to Me》- Roy Orbison 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
489
6

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部