iOS 问题记录
1).UIScrollView

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

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,由系统来调用,自己不能调用。
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];
#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];
);
}
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>'"];
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 的问题
[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];
}
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)
浙公网安备 33010602011771号