iOS开发笔记

原文请见github上iOS开发笔记

iOS开发笔记

记录了在iOS开发中踩过的坑和一些问题解决

微信的openid

微信的openid对于某个用户来说并不是唯一的,某个用户对某个公众号或者对某个微信开放平台下某个appid生成的是唯一的。appid改变,openid也会改变。公众号下和app下获得的openid不同,现阶段无法实现相同操作。使用unionid打通用户,微信开放平台上绑定了公众号,这时获取的unionid会一致。

Cell进入编辑状态,内容覆盖编辑按钮

删除一条cell时,最常用的方法就是侧滑删除。

还有就是点击编辑按钮,cell进入编辑状态,点击红色减号button,出现删除按钮,点击删除完成删除操作。这时会出现问题,cell上的内容遮盖了删除按钮,如下图所示。

如图

解决这个问题,只需要在自定义cell里加如下代码

- (void)layoutSubviews
{
    [super layoutSubviews];
    if (self.isEditing) {
        [self sendSubviewToBack:self.contentView];
    }
}
结果

View中部分内嵌UIWebView

在开发中,有的界面要求部分原生,部分根据服务器返回的URL地址显示网页。这就需要计算这部分网页的size。不然就会显示不全或者留白太多

创建UIWebView 并加载页面

UIWebView *webview = [[UIWebView alloc] init]; //创建webview
webview.delegate = self;  //设置代理
[webview loadHTMLString:url baseURL:nil]; //加载网页
[self.view addSubview:webview]; //添加到view上

在webView的代理方法中获取网页实际size

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    webView.width = self.view.width; //实际宽度
    webView.height = [webView stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight"].floatValue; //实际高度
}

设置UITextField的placeholder字体的颜色和字号

textField.placeholder = @"请输入用户名";  
[textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];  
[textField setValue:[UIFont boldSystemFontOfSize:16] forKeyPath:@"_placeholderLabel.font"];

按钮的拖动效果和点击事件并存

需求是一个按钮可以在屏幕中随意拖动,不能拖出屏幕外。距离屏幕最边缘有10像素的距离。拖动结束后,根据距离左右两侧哪侧近,靠到近的一侧。

定义Bool类型的全部变量,控制是否执行点击事件

BOOL _isClick;

创建按钮添加拖动和点击事件

//添加点击事件
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
//添加拖动事件
[btn addTarget:self action:@selector(dragMoving:withEvent:)forControlEvents: UIControlEventTouchDragInside];
//添加拖动结束时的事件
[btn addTarget:self action:@selector(dragEnded:withEvent:)forControlEvents: UIControlEventTouchUpInside];

实现事件方法

//拖动过程中
- (void)dragMoving:(UIControl *)c withEvent:ev
{
    CGPoint point = [[[ev allTouches] anyObject] locationInView:self.view];   
    point.x = MIN(MAX(point.x, btn.width * 0.5 + 10) , self.view.width - btn.width * 0.5 - 10);//范围
    point.y = MIN(MAX(point.y, 100), self.view.height - btn.height * 0.5 - 10);//范围
    c.center = point;
    _isClick = NO;
}
//拖动结束
- (void)dragEnded:(UIControl *)c withEvent:ev
{
    XDLog(@"dragEnded....");   
    CGPoint point = [[[ev allTouches] anyObject] locationInView:self.view];
    point.x = MIN(MAX(point.x, btn.width * 0.5 + 10), self.view.width - btn.width * 0.5 - 10);//范围
    point.y = MIN(MAX(point.y, 100) , self.view.height - btn.height * 0.5 - 10);//范围
    c.center = point;
    [UIView animateWithDuration:0.2 animations:^{
        c.centerX = c.centerX < self.view.width - c.centerX ? 30 : self.view.width - 30;
    }];
    _isClick = YES;
}
//点击事件
- (void)btnClick:(UIButton *)btn
{
    if (_isClick) {
        //点击方法
    }
}

UITableViewCell左滑编辑字体颜色设置

设置按钮,iOS8之后API,用下面代码设置多个按钮

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath
{
    void(^rowActionHandler)(UITableViewRowAction *, NSIndexPath *) = ^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
        NSLog(@"%@  index = %ld", action.title, indexPath.row);
        [tableView setEditing:NO animated:YES];
    };
    UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"编辑" handler:rowActionHandler];
    UITableViewRowAction *action2 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"删除" handler:rowActionHandler];
    UITableViewRowAction *action3 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"喜欢" handler:rowActionHandler];
    action1.backgroundColor = [UIColor lightGrayColor];
    action2.backgroundColor = [UIColor blackColor];
    action3.backgroundColor = [UIColor redColor];
    return @[action3,action1,action2];
}

这种方式显示的样式是系统自带的,系统指定字体和文字颜色。

按钮可以修改文字颜色,添加标题图片,背景图片等。UITableViewRowAction的显示为UIButton,修改UIButton的显示样式,cell的多个编辑按钮都会变化

[[UIButton appearance] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[[UIButton appearance] setImage:[UIImage imageNamed:@"searchtool"] forState:UIControlStateNormal];
[[UIButton appearance] setBackgroundImage:[UIImage imageNamed:@"searchtool"] forState:UIControlStateNormal];

值得注意的是下面这种方式设置字号无效

[UIButton appearance].titleLabel.font = XDFont(10);

只有一个按钮的话可以使用NSAttributedString设置显示文字的字体、字号、颜色等

NSDictionary *attributes = @{NSFontAttributeName:[UIFont systemFontOfSize:10], NSForegroundColorAttributeName:[UIColor redColor]};
NSAttributedString *attributedTitle = [[NSAttributedString alloc] initWithString:@"编辑" attributes: attributes];
[[UIButton appearance] setAttributedTitle:attributedTitle forState:UIControlStateNormal];

这种实现方式并不好有诸多问题,当有多个按钮分别设置不同的字体字号颜色时,这种方式无法实现,当找到有效方法再添加....此条权当问题记录

用Application Loader交付应用程序时,一直正在通过AppStore进行鉴定

需要修改Application Loader里的一个文件内容。

路径为

/Applications/Xcode.app显示包内容 -> Contents/Applications/Application Loader.app显示包内容 -> Contents/itms/java/lib/net.properties  

或者路径为

/Applications/Xcode.app显示包内容 -> Contents/Applications/Application Loader.app显示包内容 -> Contents/MacOS/itms/java/lib/net.properties 

打开这个文件,把第34行的http.proxyPort=443 改为https.proxyPort=80 再提交应用就ok了

pdf的展示

项目里要求读取从服务器下载下来的pdf,pdf文件是一个发票文件,下载到本地Documents目录下,展示出来。问题来了,发票上的印章不见了。

我将这个pdf文件放到了各种应用中打开,结果是:微信、qq、印象笔记、掌阅iReader、Safari、iBooks、WPS Office、mac上的预览,除了WPS Office、mac上的预览能显示出印章,其他的全部显示不出印章,甚至微信、掌阅iReader连发票上的分割线都显示不出来。

而且,用WPS Office打开,可以点击印章删除,可以点击分割线删除。这时我感觉印章和分割线是在pdf上的标注,就像以前使用Adobe的工具给pdf加标注文字,选中文字高亮显示。

最开始使用了最简单的展示pdf文件的方法:UIWebView

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePDF = [documentsDirectory  stringByAppendingPathComponent:@"file.pdf"]

//第一种webview加载方式
NSURL *url = [NSURL fileURLWithPath:_filePath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[_webView loadRequest:request];

//第二种webview加载方式
NSURL *url = [NSURL fileURLWithPath:_filePath];
NSData *data = [NSData dataWithContentsOfFile:_filePath];
[_webView loadData:data MIMEType:@"application/pdf" textEncodingName:@"UTF-8" baseURL:url];

失败!

转而使用Quartz 2D绘制pdf

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    //旋转坐标系
    CGContextTranslateCTM(context, 0, self.frame.size.height-60);
    CGContextScaleCTM(context, 1, -1);
    CGPDFPageRef pdfPage = CGPDFDocumentGetPage(_pdfDoc, 1);
    CGContextSaveGState(context);
    CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pdfPage, kCGPDFCropBox, self.bounds, 0, true);
    CGContextConcatCTM(context, pdfTransform);
    CGContextDrawPDFPage(context, pdfPage);
    CGContextRestoreGState(context);
}

失败!甚至分割线都没了

这是最常用的两种读取pdf文件的方式,然而还是显示不出来发票上面的印章

使用QLPreviewController预览

//导入QuickLook库
#import <QuickLook/QuickLook.h>
- (void)viewDidLoad {
    QLPreviewController *previ = [[QLPreviewController alloc] init];
    previ.view.frame = CGRectMake(0, 0, self.view.width, self.view.height - 200);
    previ.delegate = self;
    previ.dataSource = self;
    [self.view addSubview:previ.view];
}
//实现代理方法
#pragma mark - 在此代理处加载需要显示的文件
- (NSURL *)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx
{
    return [NSURL fileURLWithPath:filePath];
}
#pragma mark - 返回文件的个数
-(NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller {
    return 1;
}
#pragma mark - 即将要退出浏览文件时执行此方法
-(void)previewControllerWillDismiss:(QLPreviewController *)controller {
    XDLog(@"退出");
}

还是失败的没显示出来印章。

在github上找读取pdf的项目

  • UIImage-PDF 将pdf转成image显示,结果失败
  • Reader 比较著名的pdf阅读项目,支持大文件,加密文件,有着ibooks一样的界面。也有着iBooks一样的结果,同样显示不出来印章
  • PDFRenderer 结果失败
  • PDFTest 结果失败
  • PDFViewTest 结果失败
    ....

然后各种谷歌、百度、必应搜索,终于搜到了一个有用的结果

原文如下

公司的项目要读取服务器发来的PDF文件,用网上的方法读取后虽然能读出来,但是发现个问题,PDF文件有的签章不见了。这个可是大问题,试了好多iOS框架库,例如 Reader,FastPdfKit都读不出来。

在知乎上找到一个大神的发言,解释了PDF有的内容读不出来的原因。iOS 对矢量图片的支持如何? 直接引用其中的一段话:"iOS 的 Core Graphics 框架底层和 OS X 一样,都是基于 PDF 的。所以 iOS 用 PDF 很方便,比如 iOS 的 Quick Look 框架就可以直接看 PDF。如果要是只看文档那样简单的 PDF 的话,一般是没有什么问题的。不过,如果要是想看用 AI 制作的,带有多重描边、填充、网格渐变、阴影、多图层等东西的复杂 PDF 图形的话,有很大机率会出现问题。比如,在 iOS 和 OS X 上常出现的一个问题是,PDF 文稿里隐藏的图层、图形被显示出来。如果查看复杂一些的 PDF,很可能在 Adobe Illustrator、OS X、iOS、Adobe Reader 下查看的效果都不一样。所以说,PDF 虽然一般被认为是跨平台的「安全格式」,不过也并不是 100% 保险。 Adobe Reader 的 iOS 版很可能没有使用 iOS 系统自带的 PDF 和矢量绘图 API,而是自己实现了一个,因此通常 Adobe Reader 显示复杂一些的 PDF 比使用 iOS 原生 API 解析 PDF 的 App 更准确一些。还有, 无论是使用 iOS 原生的 Quick Look 还是用 Adobe Reader 查看,渲染复杂的 PDF 有可能特别慢"。公司PDF的签章好像就是多图层,在文字的底下。

找了好久,终于找到了一个能读取多图层的PDF文件的框架 - MuPDF

得出一个结论,使用Mupdf

Mupdf github地址

使用方法

处理git库不允许上传大于100M的文件

git库在上传大于50M的文件时会有警告,文件大于100M时直接拒绝push。要将这个文件从本地库和远程库中移除掉,再进行push操作。比如百度地图的导航静态库libbaiduNaviSDK.a就有100多M,做push操作时,直接报错了。

remote: warning: Large files detected.
remote: error: File gasstation/gasstation/Classes/Main/Lib/BaiduNaviSDK/libbaiduNaviSDK.a is 108.63 MB; this exceeds Git@OSC's file size limit of 100 MB
remote: error: hook declined to update refs/heads/master

如果这个文件是最近一次commit的,并没有进行push操作,换句话说进行push操作的时候报错了。那么需要删除掉本地库中这个文件的commit记录再进行push

在终端中cd进项目目录,就是项目的.git文件的目录下

cd /Users/XXX(cd后面路径换成自己项目的路径)

输入如下命令

git rm --cached /Users/XXX/XXX/libbaiduNaviSDK.a (大文件的路径)
git commit --amend -CHEAD

到这一步这个大文件从commit记录中移除了,以后的commit也不会再commit它了。此时进行push即可

还有一种情况是你无数次commit了,也不知道哪次把这个大文件commit上了,在进行push的时候报错了。

这时需要将本地代码库回滚,回滚到某个commit之前

git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除

git reset --hard HEAD~3:将最近3次的提交回滚

删除苹果开发者平台Developer里的App ID

删除苹果开发者平台Developer里的某个AppID本来是很容易的事情,点击Edit -> Delete -> 警示框中红色Delete即可。但是真实情况却坑的一逼……

Developer中的AppID对应项目中的Bundle id,是一个app的唯一标识,包括在App Store中,在各大第三方开放平台中。一般为了保证唯一性,采用公司域名反写+app项目名的方式命名。

我经历过替换开发者账号的事。事情是这样的:开发某款app在上线AppStore当天,甲方觉得提供商名字不好(因为是个人开发者账号,显示的是人名拼音)要求下架,重新提供开发者账号提交。甲方是上帝,您高兴就好,反正$99不用我掏腰包。就这样上架第一天我亲手点了下架按钮,

问题就来了,Bundle id被旧的开发者帐号占用了,新的没法用了,我不想为了换个开发者帐号把Bundle id改了,毕竟牵扯好几个第三方平台呢。那就删除原来账号的Bundle id,删除的时候有如下提醒:

img
img

在App Store上使用了,不能删除。我只好去iTunes Connect里删除了app(注意:此为大坑),问题依旧,只能求助苹果开发者平台的客服人员。

打苹果开发者客服电话: 4006 701 855 全球电话支持。坑爹的是,苹果客服人员告诉我删除不了,开发者平台中的Bundle id在app构建版本之后,不能修改或删除的。即便是你用该Bundle id发布的应用下架删除了,该Bundle id也会随着该应用永沉大海。不能删!不能改!

客服告诉我最佳的解决办法是迁移应用。将原账号的应用迁移到新账号上,应用所用到的Bundle id也会随之迁移过去。但是我把iTunes Connect里的应用删除了,那就没办法迁移了。摆在我面前的有两条路,第一:重新用旧账号打包提交审核通过,迁移应用到新账号,第二:改Bundle id。苹果客服人员对我如是说,客服诚不欺我啊!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容