ios开发_ios开发指南 - CSDN
精华内容
参与话题
  • iOS9程序设计(顶级iOS开发视频课程-Objective-C版) 本课程主要内容包括: iOS9的基础知识 常用控件 屏幕适配 多窗口 导航 表视图 GPS 地图 网络 数据存储、 音频 视频 本地化等内容,并提供了大量的...
  • iOS开发入门教程

    万次阅读 2016-07-22 21:52:18
    iOS开发入门教程,从创建项目到运行项目,包括OC基础,调试,模拟器设置等相关知识。 程序发轻狂,代码阑珊,苹果开发安卓狂!——写给狂热的编程爱好者们 写在前面的话 学习iOS应用程序开发已有一段...
    摘要
    iOS开发入门教程,从创建项目到运行项目,包括OC基础,调试,模拟器设置等相关知识。

    程序发轻狂,代码阑珊,苹果开发安卓狂!——写给狂热的编程爱好者们

    本文概览

    写在前面的话

    学习iOS应用程序开发已有一段时间,最近稍微闲下来了,正好也想记录一下前阶段的整个学习过程。索性就从最基础的开始,一步一步记录一个最简单的iOS应用从创建到运行的全过程,其中会穿插很多相关知识或是遇到过的问题。其实算不上教程,但希望能够帮助更多的开发爱好者更快、更好的入门。

    iOS开发环境简述

    最友好,最现实,也是最方便的开发环境就是在Mac系统中安装Xcode进行开发。原因在于:第一,开发工具(Xcode)限制。苹果官方只提供Mac版的Xcode,而Xcode内置了Xcode IDE,性能分析工具,iOS SDK,iOS模拟器和最新的OS X,可以方便迅速的进行代码编辑以及应用调试,可谓是Mac和iOS开发工具的不二选择。第二,代码提示和自动补全。iOS开发中用到的类或方法的名称,为了更具语义化,让开发者一目了然,通常会比较长,这往往会让刚刚接触iOS开发的开发者为了记住这些方法而伤透脑经。而Xcode拥有优于其他编辑器的OC代码提示和自动补全功能,这将很大程度降低开发入门的门槛,这决定你开发iOS应用没有理由不使用Xcode。因此,使用非苹果电脑的开发者们最好安装Mac OS X的虚拟机,进行开发学习,否则你不仅会比别人花上多出一倍甚至更多的时间去搭建开发环境,而且代码编写上也会比使用Xcode开发的人花上更多的精力。

    第一步,创建项目

    1.1 新建iOS项目

    打开Xcode,如果是首次打开Xcode,你将会看到一个欢迎界面,如图:

    Welcome to Xcode

    你可以直接在该界面中点击图中1处标记的Create a new Xcode project来创建一个项目,也可以点击图中2处标记的按钮来打开电脑中已经存在的Xcode项目。你还可以修改3处标记的复选框状态设置下次启动Xcode是否显示该欢迎界面。

    本文不演示在此点击1处所示创建项目,首先点击该界面左上角的红色按钮退出该欢迎界面,然后点击屏幕左上角的File->New->Project。截图如下:

    新建项目

    接下来你将看到如下界面:

    选择应用模板

    首先进行系统筛选,iOS应用则选择iOS列表对应项,OS X应用则选择OS X列表对应项。本例为iOS应用,故在此选择iOS中的Application(图中左上角红框所示),然后选择应用模板选择,在界面右边列出了多种最常用的应用模板类型,开发者按照自己的应用需求可自行选择,本例选择Single View Application(图中右上角红框所示)。做完以上选择后点击窗口右下角Next按钮,进入下一个设置窗口:

    应用基础信息设置

    此处内容会根据个人情况而不同,故不做赘述,按照窗口提示,填写相关信息即可。注意窗口下方的三个复选框,其功能分别是使用storyboards使用自动引用计数器包含单元测试,根据个人情况勾选/取消即可。设置完成后点击右下角Next按钮,进入下一个窗口:

    选择保存位置

    按照窗口所示,选择项目存储位置后点击窗口右下角Create按钮,完成应用创建过程。

    1.2 应用程序目录结构说明

    项目创建完成之后,Xcode会进入项目开发界面,界面大致分为三部分,左侧项目及目录结构列表、中间为代码编辑区、右侧属性设置和控件列表等区域。下面是目录结构的截图:

    项目目录结构

    项目初始时包含如图所示三个主要目录,后续开发中开发者可以自行添加目录。其中:

    • FirstIosApp目录与项目名称同名,主要存放应用相关源代码和配置文件;
    • Framework存放项目使用到的框架,默认会添加图示三个必备框架;
    • Products用于存放生成的应用文件,开发中开发者一般不必关心。

    1.3 应用程序初始结构概览

    整个应用程序的入口文件默认为AppDelegate.m,应该可以通过配置文件修改(未尝试)。其内部结构如下:

    应用程序入口结构

    该文件包含应用程序生命周期中各个阶段可以调用的方法接口,以便应用程序在不同的状态阶段能进行相应的操作。这些方法就不一一说明了,开发者几乎可以望名知意。

    1.3.1 iOS应用程序的生命周期

    对于上面图示方法如果还有不解的地方,可以参考下图(来源于网络):

    iOS生命周期

    第二步 代码入门(数据类型)

    做iOS开发,仅仅懂得使用Xcode,仅仅了解目录结构,仅仅了解生命周期,是远远不够的,这些只是基础中的基础。一定的编程能力也是必不可少的。下面就简单的介绍一下iOS开发的编程语言——Objective-C,后面简称OC。

    学习一门语言,往往需要从最基础的数据类型开始(记得大学学习的时候老师就是这么干的),至于编程逻辑,奇技淫巧等则是在开发过程中慢慢积累的。好言归正传。

    2.1 基础数据类型

    OC是C语言的一个超类,因此OC拥有C或C++的几乎所有特性,当然它也有自己独具一格的地方。所以OC也支持C语言的数据类型,诸如int,float等也都可以在OC中使用。基础数据类型不是本文重点,在此就不多言辞了。

    2.2 OC数据类型

    OC不是仅仅只能使用C/C++的数据类型,它也拥有自己的数据类型,虽然与通常人们熟知的各种数据类型看起来有点怪异,但事实上OC的数据类型是个很好玩的东西,也不难理解。下面列举几个常见的OC数据类型。

    2.1.1 NSNumber类和NSInterger

    NSNumber是以对象的形式来包装基础数据类型,它提供以下方法:

    <!-- lang: cpp -->
    + (NSNumber *) numberWithChar: (char) value;
    + (NSNumber *) numberWithInt: (int) value;
    + (NSNumber *) numberWithFloat: (float) value;
    + (NSNumber *) numberWithBool: (BOOL) value;
    

    例如,要从一个int数据初始化一个NSNumber可以这样写:

    <!-- lang: cpp -->
    NSNumber *number = [NSNumber numberWithInt: 100];
    

    而要从NSNumber实例得到NSInteger数据则可以如下操作:

    <!-- lang: cpp -->
    NSInteger integer = [number intValue];
    
    2.1.2 NSString类型

    NSString是OC的字符串类。与普通字符串不同的是NSString的值需要在普通字符串前加上一个@符号。例如要初始化一个'I'm a string.'的OC字符串,我们需要这样做:

    <!-- lang: cpp -->
    NSString *str = [NSString stringWithString: @"I'm a string."];
    

    看起来很麻烦,很复杂的样子,不要担心,OC应该也考虑到了这一点,所以它也提供简写形式:

    <!-- lang: cpp -->
    NSString *str = @"I'm a string.";
    

    NSString类还提供了很多其他形式的创建字符串的方法(比如:stringWithFormat等),这里就不一一列举了,以后在开发中慢慢体会吧。

    2.1.3 NSArray类型

    NSArray是OC的数组类。OC的数组是很强大的,在一个数组中可以允许存在不同类型的数据,这个特性就跟强大的JavaScrit一样。初始化一个数组可以这样操作:

    <!-- lang: cpp -->
    NSArray *arr = [NSArray arrayWithObjects:@"a", @"b", @1, nil];
    

    当然也支持简化形式:

    <!-- lang: cpp -->
    NSArray *arr = @[@"a", @"b", @1];
    

    需要说明一点,使用arrayWithObjects方法创建数组的时候最后需要以nil结尾,而使用简化方式的时候不需要。

    开发中可以使用以下两种形式获取数组对应索引位置(index)的值:

    <!-- lang: cpp -->
    NSString *a = arr[index];
    NSString *b = [arr objectAtIndex: index];
    

    2.1.4 NSDictionary类型

    NSDictionary是OC的字典类。字典类型在使用中以key-value键值对的形式存在。也支持多种初始化方式,下面列举两种:

    <!-- lang: cpp -->
    NSDictionary *dic = [NSDictionary dictionaryWithObjects:@[@"a",@"b", @"c"] forKeys:@[@"first", @"second", @"third"]];
    //或者使用下面的形式
    NSDictionary *dic = @{@"first": @"a", @"second": @"b", @"third": @"c"};
    

    取值方法跟NSArray大同小异:

    <!-- lang: cpp -->
    NSString *a = [dic objectForKey: @"first"];
    NSString *b = dic[@"second"];
    

    2.1.5 NSDate类型

    NSDate是OC的日期类。常见用法举例:

    <!-- lang: cpp -->
    NSDate *date = [NSDate date]; //返回当前时间
    NSDate *date = [[NSDate alloc] init]; //初始化为当前时间,类似date
    

    第三步 OC类的认识(成员变量和方法)

    iOS开发常常伴随着视图,而视图往往离不开视图控制器,在iOS开发中每一个视图控制器就是一个OC的类,因此学习iOS开发就必须了解OC的类。

    OC的类使用@interface ClassName: superClass <protocol> … @end结构来定义,NSObject是所有OC类的父类。与java相比OC的@interface关键字就等同于JAVA的class关键字,OC的protocol就是JAVA中的interface,这一点很据迷惑力,大家在学习时需要特别注意。

    3.1 类的声明

    举例声明一个Person的类(视图控制器)并实现它,拥有nameage两个成员变量,自然需要定义getNamesetNamegetAgesetAge,下面我们看下这个过程。

    首先,类的结构如下:

    <!-- lang: cpp -->
    @interface Person: NSObject {
        NSString *name;
        int age;
    }
    
    @end
    

    然后,我们声明它的setter和getter方法,用来设置和读取它的成员变量的值。按照传统方式应该如下定义:

    <!-- lang: cpp -->
    @interface Person: NSObject {
        NSString *name;
        int age;
    }
    
    - (void) setName: (NSString *) newName;
    - (NSString *) getName;
    
    - (void) setAge: (int) newAge;
    - (int) getAge;
    
    @end
    

    看,是不是很简单?然而,既然上面说了是传统方式,那么肯定OC还提供了更现代的方式:

    <!-- lang: cpp -->
    @interface Person: NSObject {
        NSString *name;
        int age;
    }
    
    @property(nonatomic, strong) NSString *name;
    @property(nonatomic, assign) int age;
    
    @end
    

    没错,你没看错,就这么简单,它的功能和上面的代码是一样的。补充一下,@property本身可以接受参数来指定变量的getter和setter方式,其参数可用值和具体功能如下:

    <!-- lang: cpp -->
    nonatomic //声明变量只在单线程中工作
    atomic //默认值,可能有多个线程会用到这个变量
    
    copy //分配一个新的空间,把原地址的内容复制过来
    assign //简单的传递指针
    retain //传递指针后引用计数器(retainCount)会自加1
    
    strong //强引用
    weak //弱引用
    

    声明就这样就完成了,下面我们看下它的具体实现,在OC中类的实现需要使用另外一个关键字@implementation,格式如下:

    <!-- lang: cpp -->
    @implementation Person
    
    @end
    

    我们还是先看下传统方式声明getter和setter方法该如何实现:

    <!-- lang: cpp -->
    @implementation Person
    
    - (void) setName: (NSString *) newName {
        self.name = newName;
    }
    
    - (NSString *) getName {
        return self.name;
    }
    
    - (void) setAge: (int) newAge {
        self.age = newAge;
    }
    
    - (int) getAge {
        return self.age;
    }
    
    @end
    

    看完传统实现方式,是不是很想一睹现代方式的风采?我们继续往下看:

    <!-- lang: cpp -->
    @implementation Person
    
    @synthesize name;
    @synthesize age;
    //或者直接下面一句
    //@synthesize name,age;
    
    @end
    

    是不是很神奇?在新版的Xcode中,@synthesize是可以省略的,但是建议还是都写上。

    3.2 “+”和“-”

    仔细的读者应该已经发现在上面的传统方式中包含了一个神奇的符号“-”。这个是什么意思呢?首先我们需要说明一下,一个类可以拥有成员变量和方法,而方法可以包含类方法和实例方法。所谓类方法是可以使用类名直接调用的方法,而实例方法是需要该类的实例才可以调用的方法。而在OC中使用“+”表示该方法为类方法,而“-”很简单自然是表示实例方法了。

    至于方法的声明和实现大致和传统方式声明getter和setter是一样的,这部分就不再重复了。

    第四步 运行和调试

    每一个应用的开发过程都是漫长的,而在这个过程中我们免不了需要不时的运行一下程序,看看当前的效果,检查一下代码是否存在异常或者错误。

    4.1 iOS模拟器

    4.1.1 选择设备

    Xcode的强大不是吹出来的,在Xcode中内置了iOS模拟器,能够模拟几乎所有iOS真机的功能,因此开发者可以通过iOS模拟器测试正在开发中的应用程序,提高开发效率,减少错误,节省开发时间。在运行前选择与应用对应的模拟设备是必须的,否则可能导致运行结果出现意外的问题。

    在Xcode的菜单栏下方提供了选择模拟器的地方,如图所示:

    选择模拟器

    选择好模拟器后点击左侧的Run按钮,就可以在指定的模拟器中启动应用了。第一次启动模拟器一般会比较慢,后面就好了。同样可以点击Run旁边的Stop按钮,停止模拟器中的当前应用。也许有些时候你想独立运行iOS模拟器,而不启动当前应用,这也是可以的,请看下图:

    启动模拟器

    也许相同的设备,但是却又多个尺寸,多个屏幕分辨率,例如:iPhone就有4、4S、5等。那怎么选择呢?别当心,有模拟器呢:

    选择不同的分辨率

    真是iOS模拟器在手,开发调试不用愁啊!

    4.1.2 模拟器自定义设置

    看完了上面的介绍,是不是感觉有一种马上动手的冲动?先别急,还有更高级的呢!大家知道,现在很多流行的iOS应用都有定位功能,那么在模拟器怎么测试定位呢?看看下图你就明白了:

    设置模拟器经纬度

    4.1.3 存储屏幕快照

    开发应用程序通常都不是一步到位的,过程中可能会产生各种各样稀奇古怪的现象,也许是显示不正常,也许是出现意外的效果,也或者你想把你当前的显示效果分享给开发团队的其他成员,这个时候作为开发者,你也许想要记录出现的这些现象,比如:截图、录屏什么的。这些都是不错的方法,但是iOS模拟器拥有更加方便的方式,如图所示:

    存储屏幕快照

    4.2 程序调试

    每一个开发者都不能保证他的程序是完美的,所以通常在我们运行程序的时候会出现很多奇怪的警告或者错误,有的可以一目了然,迎刃而解,有的却隐藏得很深,很难发现。这时候断点调试就直观重要了。

    在代码编辑器的左边的行号区,鼠标在这个区域单击可以在对应行上添加/关闭(不是删除)断点。启动断点,当再次运行程序的时候,程序若执行到当前行,则会暂停在当前行上,开发者可以在控制台看到断点处记录的信息。大致如图:

    断点调试

    如图所示,在断点处我们可以在控制台看到变量date的当前值以及内存地址等信息,这样就可以通过这些信息判断程序运行到该处时是否正常,也可以这样查看一些其他信息。

    4.3 NSLog

    有些时候我们可能会遇到一些仅靠断点无法解决的问题,这时我们还可以借助NSLog进行调试。NSLog也用于在控制台输出信息。如图:

    NSLog调试

    展开全文
  • IOS 初级开发入门教程(一)介绍篇

    千次阅读 2019-02-24 11:29:02
     目前移动端开发市场上引导开发者追求技多不压身,一个全栈开发者至少要懂后台服务器、数据库、Android、web、ios开发等。“一超多强”是指开发者先成为一门技术的专家然后掌握了解多门技术,这是一种好的发展趋势...

    导读
           目前移动端开发市场上引导开发者追求技多不压身,一个全栈开发者至少要懂后台服务器数据库Androidwebios开发等。“一超多强”是指开发者先成为一门技术的专家然后掌握了解多门技术,这是一种好的发展趋势,另外,这种技多不压身我认为当开发者更适合发展成为Leader管理岗位,随着年龄慢慢变大,成家立业后,基层单一码农已晋升之路受到阻碍了,作为项目经理或总监的时候,需要你能够“多才多艺”,才能管理好带领好你的团队。这一篇将掀起 IOS 开发之路,点关注不迷路。
     
    可跳过介绍,直接上手敲代码: IOS 新手入门实现第一个HelloWorld项目

    什么是iOS
      iOS是苹果公司为它的移动设备(iPhone、iPad、iWatch等)开发的移动操作系统。

    iOS发展史
    2007年苹果发布iPhone Runs OS X
    2008年更名iPhone OS
    2010年更名iOS
    2012年WWCD 2012上发布iOS 6
    2013年WWCD 2013上发布iOS 7
    2014年WWCD 2014上发布iOS 8和Swift
    2015年WWCD 2015上发布iOS 9和Watch OS
    IOS开发语言
    ios目前流行两种开发语言:Objective-C 和 Swift 。前者有C语言基础者上手会容易些;后者Swift是iOS/Mac未来开发的主要语言,无论从编程思想还是从api书写,都赏心悦目,但缺点是没有Objective更稳定,且事实上去面试一些公司都要求的是用 Objective-C,只是把 Swift 作为学习语言。
    苹果设备屏幕尺寸
    设备    屏幕尺寸    分辨率    坐标点
    iPhone 3和3s    3.5英寸    320*480    320*480
    iPhone 4和4s(支持Retina)    3.5英寸    640*960    320*480
    iPhone 5和5s(支持Retina)    4英寸    640*1136    320*568
    iPhone 6    4.7英寸    750*1334    375*667
    iPhone 6 Plus    5.5英寸    1080*1920    414*736
    iPad 1和2(不支持Retina)    9.7    768*1024    768*1024
    iPad 3和4(支持Retina)    9.7    1536*2048    768*1024
    iPad Air    9.7    1536*2048    768*1024
    iPad Mini(不支持Retina)    7.9    768*1024    768*1024
    iPad Mini2(支持Retina)    7.9    1536*2048    768*1024

    系统基础框架
     1、ios系统架构可以分为如图所示的四层,Cocoa Touch框架的地位不言而喻。 

    è¿éåå¾çæè¿°

    Core OSCore Service提供了底层支持,包括文件访问、网络协议、低级数据类型等。
    Media提供了基本绘图和音视频的支持,包括OpenGLQuartzCore AudioCore Animation等。
    Cocoa Touch包括了开发使用的大部分API,主要由Foundation(文件访问、网络操作、数据和容器类型)和UIKit(UI控件、控制器等)两个部分构成。在进行App开发时,应该由上到下使用这些技术层次,越上层的API封装得越好,开发越方便,但能自己发挥的东西越少。
    2、对比,android系统架构:
    Android其本质就是在标准的Linux系统上增加了Java虚拟机Dalvik,并在Dalvik虚拟机上搭建了一个JAVA的application framework,所有的应用程序都是基于JAVA的application framework之上。

    也分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和linux核心层。
    UIKit继承结构

      实现App开发中的用户界面首先要从UIResponder及其子类开始研究,当然整个过程会覆盖整个UIKit框架,比如UIColor(颜色)、UIEvent(事件)、UIFont(字体)、UIGestureRecognizer(手势识别)、UIImage(图像)、UIScreen(屏幕)等诸多内容。
    UIView和UIWindow
    1、UIWindow和UIView的继承关系
      UIWindow是UIView的子类。UIView定义了一个矩形区域以及操作这个矩形区域中内容的编程接口,除此之外UIView还要处理运行时区域中内容的交互行为(绘图、动画和事件处理)。从上面的图中我们也可以看出,我们要使用的控件都是UIView的子类型。视图会按层次结构排列,位于视图层次结构顶端的就是应用窗体。任何应用都有且仅有一个UIWindow对象,UIWindow对象就像一个容器,负责包含应用中的所有视图。应用需要在启动时创建并设置UIWindow对象,然后为其添加其他的视图,就像上面的代码呈现的那样。加入窗口的视图会成为该窗口的子视图。子视图也可以有自己的子视图从而构成一个以UIWindow作为根的视图层次结构(树形结构)。

    2、UIView的基本属性和方法
    frame属性:设置视图的坐标和尺寸
    backgroundColor属性:设置视图的背景色
    window属性:视图所在的窗口对象
    -addSubview方法:添加子视图
    Xcode创建iOS项目
      启动Xcode在欢迎页中选择"Create a new Xcode project"。在项目创建向导中选择iOS->Application->Single View Application然后点击下一步。接下来需要设置项目名称、组织名称、组织标识、开发语言(OC或Swift)和设备(iPhone、iPad或Universal)。下一步之后选择项目的位置就可以点击"Create"完成项目创建了。参考我的下一个博文:IOS新手入门第一个HelloWorld项目
    熟悉开发工具Xcode


    IDE布局说明:
    Xcode的上方是工具栏,有很多工具按钮。Xcode的左侧是导航区域,包括:项目导航、符号导航、查询导航、问题导航、测试导航、调试导航、断点导航、报告导航,可以使用Command+1-8的数字键在8种导航之间切换。Xcode的中间是编辑器区域;中间的下面是调试区域。Xcode的右侧上方是检查器(审查)区域;右侧下方是各种库的区域。

    Xcode常用功能和快捷键 (*实用)
    Command+[ -> 代码块左移
    Comamnd+] -> 代码块右移
    Tab -> 接受代码自动完成提示
    Esc -> 显示代码提示
    Command+B -> 编译
    Command+R -> 运行
    Control+F -> 前移光标
    Control+B -> 后移光标
    Control+P -> 光标移到上一行
    Control+N -> 光标移到下一行
    Control+A -> 光标移到行首
    Control+E -> 光标移到行尾
    Control+T -> 交换光标左右字符
    Control+D -> 删除光标右边的字符
    Control+K -> 删除本行
    Control+L -> 将光标所在位置置于窗口中央
    按住Option双击鼠标 -> 搜索文档
    Command+Y -> 激活/禁用断电
    Command+Control+Y -> 继续运行
    F6 -> 单步跳过
    F7 -> 单步跳入
    F8 -> 跳出
    AppDelegate与ViewController的作用与区别:
    AppDelegate是你整个应用的一个代理。当你应用启动的时候,最先被调用到的就是你AppDelegate中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法。你可以在这个方法中做些全局初始化。

    一般设计准则是尽量保持AppDelegate干净、简洁。

    AppDelegate中可以做应用退出后台或从后台返回到前台的一些处理。

    ViewController一般作为根视图控制器,把显示相关的都放到这里面去做。

    虚拟机HOME键:
    由于Xcode自带的虚拟机不像真机那样有一个可以用手指按的Home键回到主界面的实体按钮,所以需要用到快捷键:
    command + shift + h    (回到主界面)
    command + shift + hh  (可滑动清理应用)
    --------------------- 
    作者:艾阳丶 
    来源:CSDN 
    原文:https://blog.csdn.net/csdn_aiyang/article/details/77480907 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 本视频教程拥有180节课程,包含iOS开发的方方面面:iOS开发基础理论知识、 视图、视图控制器、多媒体、数据处理、常用插件、信用卡卡号识别、自动化测试、网络访问、多线程、ShareSDK社会化分享、CoreImage、...
  • 怎么学习iOS,如何学习iOS开发

    千次阅读 2018-05-04 17:49:50
    近年来ios app开发在不断发展中,各中小型也如雨后春笋纷纷露头,像广州商侣软件公司这样的app开发企业可以说是处处可见,然而ios app开发到底该如何入手,如何才能如鱼得水般在这个领域里面畅游呢? 一、什么是ios ...

         近年来ios app开发在不断发展中,各中小型也如雨后春笋纷纷露头,像广州商侣软件公司这样的app开发企业可以说是处处可见,然而ios app开发到底该如何入手,如何才能如鱼得水般在这个领域里面畅游呢?


      一、什么是ios app开发

      ios app开发是指针对苹果公司所生产的手机的ios系统的客户端软件进行开发,自从苹果手机开始上市以来,截止到2012年,4 年,65 万个 App,下载量 300 亿次,与开发者分成 50 亿美元,这是今年 WWDC苹果公布的数据。4 年来,苹果的 App Store 改变了很多人的命运,改变了人们的一些行为习惯。



    在这里我还是要推荐下我自己建的iOS开发学习群:727474737,群里都是学ios开发的,如果你正在学习ios ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有iOS软件开发相关的),包括我自己整理的一份2018最新的iOS进阶资料和高级开发教程


      二、ios app开发前景如何

      在这部分中国 iOS 开发者们看来,5 年来,苹果 App Store 带给我们最大的影响在于带来了巨大的机会和希望。而这种机遇更多的在于为个人、小团队开发者提供希望。在 App Store 面前,无论公司大小、也不管公司是否强大,一律都是平等的,这在以前是不存在这种平台的。因此对于小团队、个人开发者来说,它提供的是一种改变自身命运的平台机遇。只要能开发出足够好的产品,你就有机会在短时间内创造奇迹。

    三、如何学习ios app开发

      为了吸引、帮助更多的人成为苹果iOS app应用开发者,苹果上线了一个iOS app应用开发官方教程。想成为一名iOS应用开发者的朋友,不用再埋头苦啃什么秘籍了,苹果官方将会推出ios app开发教程来告诉你如何开发ios app应用,需要什么工具、哪方面的知识等等。现在苹果iOS设备用户数越来越多,开发者的收入也水涨船高,不少人都跃跃欲试但却又无从下手。现在有了苹果iOS应用开发官方教程,大家可以自我增值,说不定下一个畅销的iOS应用,就出自你的手。


         开发ios app,除了需要必备的软件,比如Xcode、iOS SDK,还有硬件,比如一部Mac电脑、一部iOS设备用作测试。此外,你最好还是参加苹果的iOS开发者计划,这样,你才可以更好地测试你的app应用软件,甚至让你自己开发的app在iTunes App Store上架。

         论想学什么,也无论出于什么目的想学,都需要你保持好奇心。但是作为刚想入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始。想学习编程?想自学?想高效的搞定编程这件事儿?学习编程的网站给刚入门的你,赶紧学起来。


        学习ios 。首先,基础很重要,学校开设的课程比如:数据结构和算法,设计模式,编译原理,操作系统原理,等不要认为是没有用的,在日后的编程中其实很多东西都需要用到那些知识。再掌握一门语言比如c/c++,因为很多底层的类库都是C写的。而且可以混编,特别是一些第三方的类库直接就是C++写的。其他的包括T-Sql,html,js等也可以了解下,因为基于hyper link方式的开发也在发展。


    然后,就要研究iOS开发的武器库了。入门的话可以看看基本的,很好理解也很实用。一定要学以致用!学以致用!学以致用!

    1.Beginning.iOS.5.Development.Exploring.the.iOS.SDK.Dec.2011



       2.Learn_Objective-C_for_Java_Developers/ Objective-C编程之道





    3.iOS 10 Programming Cookbook






    这三本看下来可以试试做一些简单的小项目,但是这离大神的级别是远远不够的。可能你知道但是具体为什么这么用,或者更深层次的东西你不一定了解清楚,这个时候就要看进阶文档了。

    针对程序员行业,这是一个需要努力奋斗的行业,也许他并不需要你有多高的文凭,好的文凭可以去大公司工作,没有好的文凭,但拥有丰富的工作经验,和开源库,也会是你本人实力的体现.所以,努力学习,路是自己走出来的,原地踏步谁也救不了你.。


    展开全文
  • iOS 13 黑暗模式总结探索 暗黑模式苹果开发文档 如何不进行系统切换样式的适配 注意 同一工程内多个Assets文件在打包后,就会生成一个Assets.car 文件,所以要保证Assets内资源文件的名字不能相同 苹果官方...

    导读:
    Material Design & iOS 13 黑暗模式总结探索

    暗黑模式苹果开发文档

    如何不进行系统切换样式的适配

    注意

        同一工程内多个Assets文件在打包后,就会生成一个Assets.car 文件,所以要保证Assets内资源文件的名字不能相同。
        苹果官方强烈建议适配暗黑模式(Dark Mode)此功能也是为了开发者能慢慢将应用适配暗黑模式,所以想通过此功能不进行适配暗黑模式,预计将会被拒。
    

    暗黑模式的优点:

    • 省电
    • 沉浸式效果明显
      深色背景的优势是可以突出与我们主要交互操作的内容,弱化其他辅助元素并降低屏幕整体的亮度减少视觉压力。

    全局关闭暗黑模式

    在Info.plist 文件中,添加UIUserInterfaceStyle key 名字为 User Interface Style 值为String, 将UIUserInterfaceStyle key 的值设置为 Light

    单个界面不遵循暗黑模式

    UIViewController与UIView 都新增一个属性 overrideUserInterfaceStyle
    overrideUserInterfaceStyle 设置为对应的模式,则强制限制该元素与其子元素以设置的模式进行展示,不跟随系统模式改变进行改变

    • 设置 ViewController 的该属性, 将会影响视图控制器的视图和子视图控制器采用该样式
    • 设置 View 的该属性, 将会影响视图及其所有子视图采用该样式
    • 设置 Window 的该属性, 将会影响窗口中的所有内容都采用样式,包括根视图控制器和在该窗口中显示内容的所有演示控制器(UIPresentationController)

    如何在代码里进行适配颜色(UIColor)

    + (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    - (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    
    
    

    e.g.

    [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trait) {
        if (trait.userInterfaceStyle == UIUserInterfaceStyleDark) {
            return UIColorRGB(0x000000);
        } else {
            return UIColorRGB(0xFFFFFF);
        }
     }];
    

    系统调用更新方法,自定义重绘视图

    当用户更改外观时,系统会通知所有window与View需要更新样式,在此过程中iOS会触发以下方法

    UIView
    traitCollectionDidChange(_:)
    layoutSubviews()
    draw(_:)
    updateConstraints()
    tintColorDidChange()
    
    UIViewController
    traitCollectionDidChange(_:)
    updateViewConstraints()
    viewWillLayoutSubviews()
    viewDidLayoutSubviews()
    
    UIPresentationController
    traitCollectionDidChange(_:)
    containerViewWillLayoutSubviews()
    containerViewDidLayoutSubviews()
    

    适配Dark Mode

    • 颜色适配
    • 图片适配

    1 颜色适配

    • iOS13系统动态颜色

    iOS13 之前 UIColor只能表示一种颜色,而从 iOS13 开始UIColor是一个动态的颜色,在LightModeDark Mode可以分别设置不同的颜色。
    iOS13系统提供了一些动态颜色

    @property (class, nonatomic, readonly) UIColor *systemBrownColor        API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *systemIndigoColor       API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *systemGray2Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *systemGray3Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *systemGray4Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *systemGray5Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *systemGray6Color        API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *labelColor              API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *secondaryLabelColor     API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *tertiaryLabelColor      API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *quaternaryLabelColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *linkColor               API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *placeholderTextColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *separatorColor          API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *opaqueSeparatorColor    API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    @property (class, nonatomic, readonly) UIColor *systemBackgroundColor                   API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *secondarySystemBackgroundColor          API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *tertiarySystemBackgroundColor           API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *systemGroupedBackgroundColor            API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *secondarySystemGroupedBackgroundColor   API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *tertiarySystemGroupedBackgroundColor    API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *systemFillColor                         API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *secondarySystemFillColor                API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *tertiarySystemFillColor                 API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    @property (class, nonatomic, readonly) UIColor *quaternarySystemFillColor               API_AVAILABLE(ios(13.0)) API_UNAVAILABLE(tvos, watchos);
    
    
    
    

    ① 实例

    [self.view setBackgroundColor:[UIColor systemBackgroundColor]];
    [self.titleLabel setTextColor:[UIColor labelColor]];
    [self.detailLabel setTextColor:[UIColor placeholderTextColor]];
    

    效果展示
    在这里插入图片描述
    用法和iOS13之前的一样,使用系统提供的这些动态颜色,不需要其他的适配操作

    • 自定义动态UIColor
      在实际开发过程,系统提供的这些颜色还远远不够,因此我们需要创建更多的动态颜色

    初始化动态UIColor方法

    iOS13 UIColor增加了两个初始化方法,使用以下方法可以创建动态UIColor
    注:一个是类方法,一个是实例方法

    + (UIColor *)colorWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    - (UIColor *)initWithDynamicProvider:(UIColor * (^)(UITraitCollection *))dynamicProvider API_AVAILABLE(ios(13.0), tvos(13.0)) API_UNAVAILABLE(watchos);
    
    
    
    • 这两个方法要求传一个block进去
    • 当系统在LightModeDarkMode之间相互切换时就会触发此回调
    • 这个block会返回一个UITraitCollection
    • 我们需要使用其属性userInterfaceStyle,它是一个枚举类型,会告诉我们当前是LightMode还是DarkMode
    typedef NS_ENUM(NSInteger, UIUserInterfaceStyle) {
        UIUserInterfaceStyleUnspecified,
        UIUserInterfaceStyleLight,
        UIUserInterfaceStyleDark,
    } API_AVAILABLE(tvos(10.0)) API_AVAILABLE(ios(12.0)) API_UNAVAILABLE(watchos);
    

    ② 实例

    UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
            if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
                return [UIColor redColor];
            }
            else {
                return [UIColor greenColor];
            }
        }];
        
     [self.bgView setBackgroundColor:dyColor];
    
    

    效果展示
    在这里插入图片描述

    2 图片适配

    • 打开Assets.xcassets
    • 新建一个Image set
      在这里插入图片描述
    • 打开右侧工具栏,点击最后一栏,找到Appearances,选择Any,Dark
      在这里插入图片描述
    • 将两种模式下不同的图片资源都拖进去
      在这里插入图片描述
    • 使用该图片
    [_logoImage setImage:[UIImage imageNamed:@"icon_logo"]];
    

    在这里插入图片描述
    大功告成,完成了颜色和图片的Dark Mode适配。

    获取当前模式(Light or Dark)

    有时候我们需要知道当前处于什么模式,并根据不同的模式执行不同的操作 iOS13中CGColor依然只能表示单一的颜色通过调用UITraitCollection.currentTraitCollection.userInterfaceStyle获取当前模式

    if (UITraitCollection.currentTraitCollection.userInterfaceStyle == UIUserInterfaceStyleDark) {
            [self.titleLabel setText:@"DarkMode"];
        }
        else {
            [self.titleLabel setText:@"LightMode"];
        }
        
    

    3. 其他

    1.监听模式切换

    有时我们需要监听系统模式的变化,并作出响应
    那么我们就需要在需要监听的viewController中,重写下列函数

    // 注意:参数为变化前的traitCollection
    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection;
    
    // 判断两个UITraitCollection对象是否不同
    - (BOOL)hasDifferentColorAppearanceComparedToTraitCollection:(UITraitCollection *)traitCollection;
    
    

    ① 示例

    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
        [super traitCollectionDidChange:previousTraitCollection];
        // trait发生了改变
        if ([self.traitCollection hasDifferentColorAppearanceComparedToTraitCollection:previousTraitCollection]) {
        // 执行操作
        }
        }
        
    

    2.CGColor适配

    我们知道iOS13后,UIColor能够表示动态颜色,但是CGColor依然只能表示一种颜色,那么对于CALayer等对象如何适配暗黑模式呢?当然是利用上一节提到的监听模式切换的方法啦。

    ① 方式一:resolvedColor

    // 通过当前traitCollection得到对应UIColor
    // 将UIColor转换为CGColor
    - (UIColor *)resolvedColorWithTraitCollection:(UITraitCollection *)traitCollection;
    

    实例

    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
        [super traitCollectionDidChange:previousTraitCollection];
        
        UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
            if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
                return [UIColor redColor];
            }
            else {
                return [UIColor greenColor];
            }
        }];
        UIColor *resolvedColor = [dyColor resolvedColorWithTraitCollection:previousTraitCollection];
        layer.backgroundColor = resolvedColor.CGColor;
        
    

    ② 方式二:performAsCurrent

    // 使用当前trainCollection调用此方法
    - (void)performAsCurrentTraitCollection:(void (^)(void))actions;
    

    示例

    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
        [super traitCollectionDidChange:previousTraitCollection];
        
        UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
            if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
                return [UIColor redColor];
            }
            else {
                return [UIColor greenColor];
            }
        }];
        [self.traitCollection performAsCurrentTraitCollection:^{
            layer.backgroundColor = dyColor.CGColor;
        }];
        
    }
    
    

    方式三:最简单的方法
    直接设置为一个动态UIColor的CGColor即可

    - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
        [super traitCollectionDidChange:previousTraitCollection];
        UIColor *dyColor = [UIColor colorWithDynamicProvider:^UIColor * _Nonnull(UITraitCollection * _Nonnull trainCollection) {
            if ([trainCollection userInterfaceStyle] == UIUserInterfaceStyleLight) {
                return [UIColor redColor];
            }
            else {
                return [UIColor greenColor];
            }
        }];
            layer.backgroundColor = dyColor.CGColor;
    }
    
    
    

    ⚠️!!! 设置layer颜色都是在traitCollectionDidChange中,意味着如果没有发生模式切换,layer将会没有颜色,需要设置一个基本颜色

    3.模式切换时打印log

    • 在Xcode菜单栏Product->Scheme->Edit Scheme
    • 选择Run->Arguments->Arguments Passed On Launch
    • 添加以下命令即可
      UITraitCollectionChangeLoggingEnabled YES
      在这里插入图片描述

    4.强行设置App模式

    当系统设置为Light Mode时,对某些App的个别页面希望一直显示Dark Mode下的样式,这个时候就需要强行设置当前ViewController的模式了

    // 设置当前view或viewCongtroller的模式
    @property(nonatomic) UIUserInterfaceStyle overrideUserInterfaceStyle;
    

    示例

    // 设置为Dark Mode即可
    [self setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark];
    

    ⚠️ 注意!!!

    • 当我们强行设置当前viewControllerDark Mode后,这个viewController下的view都是Dark Mode
    • 由这个ViewController present出的ViewController不会受到影响,依然跟随系统的模式
    • 要想一键设置App下所有的ViewController都是Dark Mode,请直接在Window上执行overrideUserInterfaceStyle
    • window.rootViewController强行设置Dark Mode也不会影响后续present出的ViewController的模式

    5.NSAttributedString优化

    对于UILabel、UITextField、UITextView,在设置NSAttributedString时也要考虑适配Dark Mode,否则在切换模式时会与背景色融合,造成不好的体验

    推荐的做法

    // 添加一个NSForegroundColorAttributeName属性
    NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:16],NSForegroundColorAttributeName:[UIColor labelColor]};
    NSAttributedString *str = [[NSAttributedString alloc] initWithString:@"富文本文案" attributes:dic];
    
    
    

    总结

    总的来说,iOS13主要有以下变化:
    1.支持 Dark Mode
    2.UIColor变为动态颜色
    3.更新StatusBar样式
    4.更新UIActivityIndicatorView样式

    参考文档

    iOS开发如何适配暗黑模式(Dark Mode)
    iOS13 暗黑模式(Dark Mode)适配之OC版

    展开全文
  • 如何申请ios开发账号

    千次阅读 2018-08-23 11:22:35
    登录苹果开发者网站,在首页最下端左边找到【Developer Program】。  进入【Apple Developer Program】页面后,点击左上角的【注册】按钮。 https://developer.apple.com/programs/ ...如果没有创...
  • iOS开发app打包

    2019-08-28 14:34:53
    1.申请苹果开发者账号 申请苹果开发者账号在APP store 里发布应用。 开发者账号分类:(1)个人开发者账号 (2)企业开发者账号 主要的区别是:点击这里 ...在电脑安装发布许可证,这样你的电脑才能发布程序。... ...
  • iOS开发流程

    2020-06-07 19:47:14
    此流程适用给对iOS开发啥都不清楚的小白 iOS开发首先需要申请苹果开发者帐号, 来上线项目, 可供用户在app store下载, 开发者帐号费用为人民币688元每年, 以下为流程. 1.申请公司邓白氏编码 【申请链接】: ...
  • ios开发知识汇总

    千次阅读 2018-06-11 09:30:10
    1.技术基础1、为什么说Objective-C是一门动态的语言?这里的动态和静态是相对的,动态的意思是不需要在编译时确定所有的东西,在运行时也可以动态添加变量,属性,方法和类. Objective-C 可以通过Runtime这个运行时机制,...
  • 看什么看!点我呀!全栈程序员,免费入门到精通!作者丨开发之家https://www.jianshu.com/p/1fd231cfe54b前言iOS开发语言有哪些?OS开发...
  • 本课程主要介绍了开发iOS app的一些基本情况。例如,需要的硬件和软件条件,如何申请开发者账号,XCode的常用功能介绍。后给出一个iOS App的案例来演示开发App的过程。
  • 从零练就iOS高手实战班

    万人学习 2018-10-22 21:38:03
    iOS课程教学从入门到实战,系统讲解Swift编程,精讲基础语法,详解iOS基础框架,知识点涵盖新潮实用的swift,AppleWatch App开发。 咨询QQ:2528047463 咨询群:462917576 付费学员答疑群:446896569
  • C语言基础1-2天。其中包括开发概述及简单语法。
  • C语言基础19-21天。其中包括property、继承多态、《购票系统》。
  • 小波说雨燕 第五季 Core Data实战

    万人学习 2019-06-26 11:52:34
    小波带你从新手角度,啃读原版英文ios8 +swift教材 课程素材免费下载
  • iOS8开发技术(Swift版):常用控件

    万人学习 2018-10-22 21:38:02
    本课程主要介绍了iOS中常用的控件的功能和使用方法。
  • C语言基础3-4天。其中包括运算符和判断语句。
  • C语言基础7-8天。知识点回顾、初识数组与排序。
  • 完全征服React Native

    万人学习 2018-10-22 21:38:05
    React Native是Facebook于2015年推出的跨平台开发工具,可用于开发Android和iOS App,并且同时具有混合开发的优点(热更新,跨平台)以及本地App的性能。 本课程采用新的ES6开发,主要内容包括ReactNative的基础知识...
1 2 3 4 5 ... 20
收藏数 403,478
精华内容 161,391
关键字:

ios开发