iOS tips随笔
iOS tips随笔
哈哈8066 发表于3年前
iOS tips随笔
  • 发表于 3年前
  • 阅读 126
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: iOS中的一些小笔记

定义时候用到的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];

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

共有 人打赏支持
粉丝 3
博文 40
码字总数 11565
×
哈哈8066
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: