iOS开发总结

记录iOS开发过程中使用的技术、遇到的问题以及解决方法。

自定义系统键盘上方的View有两种方法

1.设定textfield或者textview的inputAccessoryView属性
2.监听键盘事件,获取键盘高度,动态改变自定义View的位置

CocoaPods 执行 pod update 和 pod install 卡住不动

使用加参数的命令:
pod install –verbose –no-repo-update
或者
pod update –verbose –no-repo-update

添加PCH文件

添加PCH文件
注意在BuildSetting中设置Prefix header路径

添加讯飞语音需要的系统类库

添加讯飞语音需要注意的

安装CocoaPods错误

如果是下面这个错误:
Could not find a valid gem ‘cocoapods’ (>= 0), here is why: Unable to download data from https://rubygems.org/ - Errno::ETIMEDOUT: Op…

解决方法,看这里!

Undefined symbols for architecture arm64

  1. 检查Pod的TARGETS和工程项目的TARGETS的BuildSetting
    此处输入图片的描述

  2. 检查工程项目TARGETS的Other Linder Flags
    此处输入图片的描述

理解armv7 armv7s arm64 i386 x86_64

看这篇博文

什么时候用Block或代理?

看这篇博文
1.要是一个对象有超过一个的不同的事件,使用代理
2.要是一个对象是个单例,我们不能使用代理
3.要是一个对象调用方法需要返回一些额外的信息,我们可能需要使用代理
4.过程 vs. 结果
5.速度(也许吧?)

具体情况,具体分析!

使用%运算符出现错误:invalid operands to binary expression (‘CGFloat’(aka ‘double’) and ‘CGFloat’)

CGFloat c = a % b;
解决:% is for int or long, not float or double.
You can use fmod() or fmodf() from instead.
Better is as suggested by the inventor of CGFloat.

Objective-C浮点数向上取整和向下取整:

向上取整:ceil(f)//f为浮点数
向下取整:floor(f)//f为浮点数

TableView的分割线从顶端开始:

if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {  
  [self.tableView setLayoutMargins:UIEdgeInsetsZero];  
} 


if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {  
 [cell setSeparatorInset:UIEdgeInsetsZero];  
}  
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {  
[cell setLayoutMargins:UIEdgeInsetsZero];  
}

Swift中宏替换与代码标识

看这里

监听输入框内容的改变

[textField addTarget:self action:@selector(textFieldValueChanged:) forControlEvents:UIControlEventEditingChanged];

[button setTitleColor:[UIColor redColor] forState:UIControlStateSelected]不起作用

因为设置了button的AttributedTitle,所以在[button setSelected:YES];之前,先设AttributedTitle为nil
如下:
[button setAttributedTitle:nil forState:UIControlStateNormal];

保存图片到相册

/**
 *  保存图片
 */
- (void)saveImage{
    /**
     *  将图片保存到iPhone本地相册
     *  UIImage *image            图片对象
     *  id completionTarget       响应方法对象
     *  SEL completionSelector    方法
     *  void *contextInfo
     */

    UIImageWriteToSavedPhotosAlbum(_allImagesOfThisArticle[currentPhotoIndex], self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}


- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo: (void *)contextInfo
{
    if (!error)
    {
        //it worked do the thing
    }

}

Request failed: unacceptable content-type: text/html using AFNetworking 2.0

解决方法是添加:
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@”text/html”];

Xcode打开代码聚焦栏(Focus Ribbon)的方式

此处输入图片的描述

Xcode查找快捷方式(以code folding为例)

此处输入图片的描述

区分StoryBoard中的Show、Show Detail、Present Modally、Popover Presentation、Custom

  • Show

将目标试图控制器push到navigation堆栈中,由右至左地显示试图控制器,提供一个后退按钮在navigation bar 上。

例如:应用Mail中导航到收件箱

  • Show Detail

在UISplitViewController中,替换详情视图或次级视图,不提供返回按钮。

例如:iPad上的邮箱应用在横屏时,点击左侧侧边栏的邮件列表,右侧显示邮件的详情。

  • Present Modally

通过定义不同的Presendation option,以不同的方式展示视图控制器,覆盖上一个视图控制器。最常用的呈现动画是从屏幕底部出现视图控制器,覆盖整个屏幕。但是,在iPad上,最常见的呈现方式是将视图控制器呈现在屏幕的正中间,并且将底部的视图控制器变暗,从下向上出现。

例如:点击iPhone上日历应用的”+”按钮。

  • Popover(iOS8之后改为:Present as Popover)

当在iPad中运行时,目标视图展示在一个小popover视图中,点击popover视图之外的其他任何地方,视图将消失。iPhone也支持popover,但是,如果连接一个Popover Presentation segue,将会与执行Present Modally的效果相同。

例如:在iPad上的日历应用中点击+按钮。

  • Custom

你可能会实现和控制自定义的视图切换方式。

这些视图切换类型在iOS8中被弃用:Push、Modal、Popover、Replace。

看这里,了解更多

关于M_PI

#define M_PI     3.14159265358979323846264338327950288 

其实它就是圆周率的值,在这里代表弧度,相当于角度制 0-360 度,M_PI=180度
旋转方向为:顺时针旋转

sender.transform = CGAffineTransformRotate(sender.transform, -M_PI_2*1.0);

sender.transform = CGAffineTransformRotate(sender.transform, -M_PI_2*1.0);

判断ScrollView向左滑还是向右滑?

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{

        contentScrollViewCurrentPosition = scrollView.contentOffset;


        if (contentScrollViewCurrentPosition.x < contentScrollViewStartPosition.x &&
            contentScrollViewCurrentPosition.x < myContentScrollView.contentSize.width) {
            scrollDirection = DirectionLeft;
        }else if(contentScrollViewCurrentPosition.x > contentScrollViewStartPosition.x &&
                 contentScrollViewCurrentPosition.x > 0){
            scrollDirection = DirectionRight;
        }
}

// 当开始滚动视图时,执行该方法。一次有效滑动(开始滑动,滑动一小段距离,只要手指不松开,只算一次滑动),只执行一次。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{

contentScrollViewStartPosition = scrollView.contentOffset;

}

热评文章