iOS 问题记录

1).UIScrollView

 
    self.automaticallyAdjustsScrollViewInsets = NO;//自动调整滚动视图插入,默认是YES
 

2)Device Orientation

 

 

3)当我们所写的程序里没用用Nib文件(XIB)时,用代码控制视图内容,需要调用initWithFrame去初始化

- (id)initWithFrame:(CGRect)aRect
{
    if ((self = [super initWithFrame:aRect])) {
       //TODO:初始化代码
    }
    return self;
}

用于视图加载nib文件,从nib中加载对象实例时,使用 initWithCoder初始化这些实例对象

- (id)initWithCoder:(NSCoder*)coder
{
    if ((self = [super initWithCoder:coder])) {
        //TODO:初始化代码
    }
    return self;
}

 

1.initWithCoder: 对于.xib,当你嵌入一个视图对象到xib,视图加载时默认调用的是该方法;例如:假如创建的view来自nib,那么将会调用initWithCoder,由系统来调用,自己不能调用。

 

2.initWithFrame: 非.xib的手动编码,视图加载时默认调用的是该方法。是由自己调用,来初始化对象的 
iOS从info.plist 获取项目的名称及版本号:
NString *executableFile = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleExecutableKey];

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];

 

还有其它很多信息可由infoDictionary获得,可看官方文档里的说明

 

4)在ARC中使用performSelector会有警告
例如:
if ([target respondsToSelector:action])
 {
             [target performSelector:action withObject:exportPath withObject:nil];
 }

会出现警告:performselector-may-cause-a-leak-because-its-selector-is-unknown
解决方法,添加宏:
#define MJPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)

 使用:

if ([target respondsToSelector:action])
 {
        MJPerformSelectorLeakWarning(
                 [target performSelector:action withObject:exportPath withObject:nil];  
       );
 }

 

5) 在使用AFNetworking 时: 请求失败
Request failed: unacceptable content-type: text/plain ,加上类似下面这段代码,序列化一次([AFHTTPResponseSerializer serializer])

 

if (request.requestSerializerType == YTKRequestSerializerTypeHTTP) {
        _manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        _manager.responseSerializer=[AFHTTPResponseSerializer serializer];
    } else if (request.requestSerializerType == YTKRequestSerializerTypeJSON) {
        _manager.requestSerializer = [AFJSONRequestSerializer serializer];
        _manager.responseSerializer=[AFJSONResponseSerializer serializer];
    }

 

6) 在用到CGImageRef类中的CGImageCreateWithImageInRect函数,需要配套进行release,CGImageRelease(imageRef); 例如,

UIImage *default_image=[UIImage imageNamed:@"default"];
    CGRect smallRect=CGRectMake((414-ScreenWidth)*0.5, 0, ScreenWidth, cellHeight);
    CGImageRef smallImage=CGImageCreateWithImageInRect(default_image.CGImage, smallRect);
    UIImage *default_image2=[UIImage imageWithCGImage:smallImage];
    CGImageRelease(smallImage);

7)UIWebView 中方法webViewDidFinishLoad:

//屏蔽网页js效果,无效,
    [webView stringByEvaluatingJavaScriptFromString: @" var script = document.createElement('script'); "
     " script.type = 'text/javascript'"
     " script.text = '<noscript> </noscript>'"];

 

8)动画
CABasicAnimation *anim = [CABasicAnimation animation];
    anim.keyPath = @"transform.rotation";
    anim.toValue = @(2 * M_PI * 3);
    anim.duration = 1.5;
    // 开头和结尾比较慢,中间快
    anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    anim.delegate = self;
    [self.centerWheel.layer addAnimation:anim forKey:nil];

        CATransition *animation = [CATransition animation];

        //设置运动时间
        animation.duration = 1;
        //设置运动type
        animation.type = @"rippleEffect";//水波效果
        //设置运动速度
        animation.timingFunction = UIViewAnimationOptionCurveEaseInOut;       
        [button.layer addAnimation:animation forKey:@"animation"];
        
        CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"transform.scale"];
        animation.fromValue=[NSNumber numberWithFloat:1.0];
        animation.toValue=[NSNumber numberWithFloat:0.8];
        animation.autoreverses=YES;
        animation.duration=time;
        animation.repeatCount=2;       
        animation.removedOnCompletion=NO;
        animation.fillMode=kCAFillModeForwards;       
        [button.layer addAnimation:animation forKey:@"transform.scale"];
9)自定义UITabBarController 的问题

 

设置透明的Tabbar的时候,需要重新设置一个空得ShadowImage,否则会有条黑线

 

[self.tabBar setShadowImage:[UIImage new]];//设置shadowimage 为一张空图片

 

10)YTKNetwork  YTKNetworkAgent.m   89行代码

if (request.requestSerializerType == YTKRequestSerializerTypeHTTP) {
        _manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        _manager.responseSerializer=[AFHTTPResponseSerializer serializer];
    } else if (request.requestSerializerType == YTKRequestSerializerTypeJSON) {
        _manager.requestSerializer = [AFJSONRequestSerializer serializer];
        _manager.responseSerializer=[AFJSONResponseSerializer serializer];
    }

11)最近工作中遇到自己定义的tabbar在iOS8 中重叠的情况.就是原本已经移除的UITabBarButton再次出现

那么按照apple的一贯作风。一定会调用viewWillAutolayout这个方法。

解决方法:

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    for (UIView *child in self.tabBar.subviews) {
        if ([child isKindOfClass:NSClassFromString(@"UITabBarButton")]) {
            [child removeFromSuperview];
        }
    }
}

- (void)viewWillAppear:(BOOL)animated
{
    // 删除系统自动生成的UITabBarButton
    for (UIView *child in self.tabBar.subviews) {
        if ([child isKindOfClass:[UIControl class]]) {
            [child removeFromSuperview];
        }
    }
    [super viewWillAppear:animated];
}

 

12)在两个UIView(A和B),B 是A 的subview,A设置alpha值,B的alpha 也变了,为了解决B的alpha不变,可以设置A的背景颜色的透明度,UIColor的 colorWithAlphaComponent:方法

 

CGFloat alpha=0.5; 
self.view.backgroundColor=[[UIColor grayColor] colorWithAlphaComponent:alpha];

 

13)UITableView 没有数据的时候,不显示横线,执行下面方法,

 

-(void)setExtraCellLineHidden: (UITableView *)tableView
{
    UIView *view = [UIView new];   
    view.backgroundColor = [UIColor clearColor];   
    [tableView setTableFooterView:view];
}

 

14)UITableView 设置分割线 [self.tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];

 

-(void)viewDidLayoutSubviews
{
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
    }
    
    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
    }
}



-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        
        [cell setSeparatorInset:UIEdgeInsetsZero];
        
    }
    
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        
        [cell setLayoutMargins:UIEdgeInsetsZero];
        
    }
}

 

15)、UIWebView  加载页面方法一

//3.创建回话,这里使用全局回话,并且启动任务
    NSURLSession *session=[NSURLSession sharedSession];

//从回话创建任务
    NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        if (!error) {
//            NSString *dataStr=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//            LogDebug(TBaseWeb,@"request web data:%@ ",dataStr);
//           NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response;
//            NSDictionary *dict=[httpResponse allHeaderFields];
            _isRequestCompleted=YES;
            
            [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;
            [MBProgressHUD hideHUDForView:self.view animated:YES];
            
            [self.webView  loadData:data MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:URL];
            
            
        }else{
            HHLog(@"%@",error.localizedDescription);
        }
    }];
    [dataTask resume];//恢复线程,启动任务

UIWebView  加载页面方法二

[self.webView loadRequest:request];

发现方法一  在使用goback方法时,不能放回,而方法二可以

if (self.webView.canGoBack) {
        [self.webView goBack];
    }

=======================iOS动态获取UIWebView高度

监听了 webView的 contentSize,每当contentSize的值改变时就去更改webView 的frame

[activityWebView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];  
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context  
{  
  if ([keyPath isEqualToString:@"contentSize"]) {  
    webViewHeight = [[activityWebView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"] floatValue];  
    CGRect newFrame    = activityWebView.frame;  
    newFrame.size.height  = webViewHeight;  
    activityWebView.frame = newFrame;  
    [mainTableView setTableHeaderView:activityWebView];  
  }  
}  

JS  计算高度(以下几种相差不大)

[webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"];

[webView stringByEvaluatingJavaScriptFromString:@"document.body.offsetHeight"];

[webView stringByEvaluatingJavaScriptFromString:@"document.body.clientHeight"];

document.documentElement.scrollHeight

=======================

使用UITableView  时,有时候设置 cell.separatorInset=UIEdgeInsetsZero;不起作用

处理方法:

 

-(void)viewDidLayoutSubviews
{
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
    }
    
    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsMake(0,0,0,0)];
    }
}



-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        
        [cell setSeparatorInset:UIEdgeInsetsZero];
        
    }
    
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        
        [cell setLayoutMargins:UIEdgeInsetsZero];
        
    }
}

16)、

1、是否实现协议:respondsToSelector:
if([self.delegate respondsToSelector:@selector(loginViewLoginSucceed:)]){
                [self.delegate loginViewLoginSucceed:self];           
        }

2、类是否有遵守协议:conformsToProtocol:
if (![myClass conformsToProtocol:protocol]) {
        NSParameterAssert(0);// class 未实现protocol
        return;
    }

3、执行某方法:performSelector:
消除警告:
#define MJPerformSelectorLeakWarning(Stuff) \
do { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
Stuff; \
_Pragma("clang diagnostic pop") \
} while (0)


- (void)awakeFromNib
{
    [[NSBundle mainBundle] loadNibNamed:@"FaceView" owner:self options:nil];
    [self addSubview:self.contentView];
}

 

 19)

只要scrollView是其父视图上的第一个子视图,且navigationBar不隐藏的情况下,添加到scrollView里的视图,都会默认下移64个像素

禁止系统偏移  vc.automaticallyadjustsScrollviewInsets =NO

20)

使用-componentsSeparatedByString:来切分NSArray。 如:

NSString *string = @”one:two:three”; 
NSArray *aArray = [string componentsSeparatedByString:@":"];

用-componentsJoinedByString:来合并NSArray中的各个元素并创建一个新的字符串,如: 
string = [aArray componentsJoinedByString:@","];

21)

posted on 2015-12-16 20:24  二狗你变了  阅读(423)  评论(0)    收藏  举报

导航