Giter VIP home page Giter VIP logo

practice-of-ios's People

Contributors

hankzhu91 avatar jeakey avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

practice-of-ios's Issues

【第二章学习笔记】ios窗口与视图的知识

UIKit 框架

20130507134249884

UIWindow(窗口)

UIWindow 的主要功能:一是提供一个区域来显示视图(UIView),二是将事件(event)分发给视图。一个应用至少有一个 UIWindow,大多数 iOS 应用程序在其生命周期内只有一个 UIWindow。虽然 iOS 支持将一个 UIWindow 放在其他 UIWindow 上方,但是你的应用程序永远不应该创建多个窗口,因为这会影响事件的传递。UIWindow 本身不具有任何可见的内容,但它对于视图提供了一个容器。

UIWindow 对象有以下职责:

  • 它包含了应用程序的可视化内容
  • 它为视图和其他应用程序对象在触摸事件中提供了关键性的作用
  • 它与视图控制器一起协作来呈现数据

每个 UIWindow 对象都有 windowLevel 属性,一般不应该去改变它,但是通过对其设置,可以做到隐藏状态栏等效果。self.window.windowLevel = UIWindowLevelStatusBar

UIView(视图)

在 iPhone 上所能看到的大部分控件都是 UIView 的子类。

1. 坐标体系:

iPhone 坐标系是以左上角为原点的,每一个 view 的 frame 所使用的坐标系以它的 父视图 的左上角为原点。

与视图坐标系相关的函数:

  • CGPoint point = CGPointMake(x, y);
  • CGSize size = CGSizeMake(w, h);
  • CGRect rect = CGRectMake(x, y, w, h);

Frame、Bounds 与 Center 属性

  • Frame 以其父视图为起点,得出 UIView 自己的位置信息
  • Bounds 以 iOS 系统的坐标原点为起点,坐标永远是 (0, 0)
  • Center 表示视图中心点所在的位置,设置此属性可改变视图位置
  • 当你设置了三者中的某一个的时候,其他两个值会相应变化

2. 视图的层次结构

  • UIView 层次结构可以理解为「视图树」——view hierarchy
  • 一个视图就是一个容器,当一个视图包含其他视图的时候,两个视图之间就建立了一个父子关系
  • 从视觉上看,子视图遮盖了父视图的内容,设置透明属性可以看到父视图的内容
  • 每个父视图都有一个有序的数组存储着它的子视图,存储的顺序就会影响到每个子视图的显示效果
  • 一个视图可以嵌入多个 subview,但是只能有一个 superview

UIView 常用方法

addSubView:  // 添加子视图
insertSubview: atIndex  // 视图插入到指定索引位置
insertSubview:aboveSubview:  // 视图插入指定视图之上
insertSubview:belowSubview:  // 视图插入指定视图之下
bringSubviewToFront:  // 把视图移动到最顶层
sendSubviewToBack:  // 把视图移动到最底层
exchangeSubviewAtIndex:withSubviewAtIndex:  // 把两个索引对应的视图调换位置
removeFromSuperview:   // 把视图从父视图中移除

3. UIView 的基本属性和自定义

查找视图

  • UIView 类中有一个 tag 属性,通过这个 tag 属性可以标示一个视图对象(整数)
  • 获取的方法:viewWithTag: 来检索表示过的 子视图

UIView 常用属性

  • alpha:透明度
  • backgroundColor:背景颜色
  • subViews:子视图集合
  • hidden:是否隐藏
  • tag:标签值
  • superview:父视图
  • multipleTouchEnabled:是否开启多点触摸
  • userInteractionEnabled:是否响应触摸事件

4. UIView 的 contentMode(内容模式)

视图的 contentMode 决定了控件变化和缩放的方式,直接看图:

scaleaspect

它的值有:

   UIViewContentModeScaleToFill,
   UIViewContentModeScaleAspectFit,
   UIViewContentModeScaleAspectFill,
   UIViewContentModeRedraw,
   UIViewContentModeCenter,
   UIViewContentModeTop,
   UIViewContentModeBottom,
   UIViewContentModeLeft,
   UIViewContentModeRight,
   UIViewContentModeTopLeft,
   UIViewContentModeTopRight,
   UIViewContentModeBottomLeft,
   UIViewContentModeBottomRight,

对于超出的范围的内容,可以使用属性 uiview.clipsToBounds = YES 进行裁剪。

第二章作业

针对上面所说的 contentMode,实现一个界面,里面有一个图片容器、一个按钮和一行文本,按钮每次点击分别切换一种不同的 contentMode 并在文本中显示初具体的模式,目的是实现图片的填充缩放模式的切换浏览。类似下图:

image

【第五章学习笔记】导航控制器基本概念和用法

导航控制器基本概念

导航控制器是以栈的形式来实现,一个视图控制器以入栈(push)的方式加入导航控制器,以出栈(pop)的方式移除,所以出栈以后,相应的视图控制器也将销毁。

导航控制器包括导航栏(NavigationBar)和底部工具栏(UIToolBar)两部分组成。
image

实现导航控制器

// 导航控制器初始化
RootViewController  *rootVC = [[RootViewController alloc] init];
UINavigationController *navigation=[[UINavigationController alloc]initWithRootViewController:rootVC];
self.window.rootViewController = navigation;

// 子控制器设置title
self.title=@"title";//控制器本身实现
[pageVC setTitle:@"title"];//外部改变

// 控制器之间导航
[self.navigationController pushViewController:pageVC animated:YES];
[self.navigationController popToRootViewControllerAnimated:YES];
[self.navigationController popViewControllerAnimated:YES];
[self.navigationController popToViewController:pageVC animated:YES];

// 显示隐藏导航栏和工具栏
[self.navigationController setNavigationBarHidden:YES animated:YES];
[self.navigationController setToolbarHidden:YES animated:YES];

导航控制器层次关系

image

UINavigationBar

image
image

image

导航控制器的委托方法

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

本章作业

参照下面的例子,首页上放置一个按钮,点击切换到另一个view1(4分),在view1上放置两个按钮,点击第一个按钮返回到根页面,点击第二个按钮切换到子页面(8分),在子页面放置两个按钮,点击第一个按钮返回到根页面,点击第二个按钮返回到上一级页面(12分),自定义首页导航栏右上角按钮,点击在页面内增加一个按钮,并依次命名为view2、view3...依次类推,点击这些按钮,切换到跟view1同样的页面,只是title改为按钮相应的文字(16分)。
具体请参考:
https://modao.io/app/2meosEpFMDGNM5yBpB0R

【第三章学习笔记】视图控制器的基本概念和用法

视图控制器的装载

image

这张图清晰的描述了视图控制器的装载过程,有几个注意点:

  1. 当访问view属性时,如果view不存在,则UIViewController会自行调用loadview方法。
  2. 如果想通过代码的方式来实现界面,一般都是需要重写loadview方法,在loadview方法中构建视图。

视图控制器的生命周期

整个视图控制器的生命周期依次如下:

  • initWithNibName:bundle:
  • loadview
  • viewDidload
  • viewWillAppear
  • viewDidAppear
  • viewWillDisappear
  • viewDidDisappear

add view

image

当视图控制器add到window时,会依次调用viewWillAppear(视图将要渲染)和viewDidAppear(视图已经渲染好)

视图卸载

image

当内存警告时,会优先将不活跃的viewcontroller卸载掉。

可以通过模拟器来模拟内存警告。

事件响应

image

事件响应跟js的事件冒泡类似,每次用户的操作的事件都会冒泡,如果程序没有截获,就会丢弃。

特性检测(版本判断)

与js类似,可以判断是否支持某个方法:respondsToSelector:@selector(function)

如果需要判断系统版本,可以通过以下方式获取:

if([[UIDevice currentDevice].systemVersion floatValue] < 6.0){
    //6.0以下版本的处理
}else{
   //6.0以上版本的处理
}

屏幕旋转

可以通过以下方式来检测和禁用旋转方向:

// 这个方法是6.0以下的方法,return NO;则不旋转屏幕
- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) toInterfaceOrientation
{
   return (toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

// 6.0以上将上面的方法拆分为以下两个方法:
// 这个方法return NO;则不旋转屏幕
- (BOOL) shouldAutorotate
{
   return YES;
}
// 这个方法用来指定支持哪个方向
- (NSUInteger) supportedInterfaceOrientations
{
  return UIInterfaceOrientationMaskAllButUpsideDown;
}

// 任何版本都支持。屏幕将要旋转过来时调用,如果上面方法return NO;则不调用,一般在这里做横屏适应
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
}

除了这些方式,也可以通过监听UIDeviceOrientationDidChangeNotification来检测方向改变。

// 事件监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceOrientation:) name:UIDeviceOrientationDidChangeNotification object:nil];
- (void)deviceOrientation:(NSNotification *)notification
{

   UIDevice *device = (UIDevice *)[notification object];
  // 获取屏幕旋转的方向
   NSLog(@"device : %d",device.orientation);
}

不同viewController间参数传递

代理

// 定义代理
@protocol ModalViewControllerDelegate<NSObject>
- (void)changeLabelText:(NSString *)text;
@end

// 定义好以后要使相应的类实现这个代理。

// 在需要代理的地方定义这个代理对象
@property (nonatomic,assign) id <ModalViewControllerDelegate> delegate;

// 调用代理方法
[self.delegate changeLabelText:@"text"];

通知

通知的方式很简单,但是通知应用频繁容易使逻辑混乱,因为通知是其他类没有关联性。

// 发布通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeLabelTextNotification" object:@"text"];

// 通知监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLabelText:) name:@"ChangeLabelTextNotification" object:nil];

本章作业

新建单视图项目,使用代码的方式(4分)构建一个5*8黑白相间的全屏网格(8分),点击每个格子都弹出一个模态视图(12分),模态视图上包含一个返回按钮和一个label,label显示点击了第n个格子(n为点击的格子在网格中的位置)(16分)。其中参数传递需要用至少两种不同的方式来实现。点击返回按钮,则返回到根视图,如此循环。

【第七章学习笔记】滑动视图基本概念和用法

UIScrollView的基本概念和用法

  • UIScrollView它是一个视图,然后它是一个可以选择滑动的视图,用与显示更多的 内容
  • 其次,通过scrollView可以通过手势,放大或者缩小显示的内容
  • UIScrollView包含两个子类,其中一个就是UITableView,因此,表视图的可以实 现滑动视图的所有行为

创建一个UIScrollView实例

// 创建 个UIScrollView实例

CGRect frame = CGRectMake( 0, 0, 200, 200);
UIScrollView *scrollView= [[UIScrollView alloc] initWithFrame:frame];

// 添加子视图(框架可以超过scrollview的边界)

frame= CGRectMake( 0, 0, 500, 500);
UIImageView *myImageView= [[UIImageView alloc] initWithFrame:frame]; [scrollView    addSubview:myImageView];

// 设置内容尺寸

scrollView.contentSize = CGSize(500,500);

滑动视图常用属性

属性 描述
contentSize 里面内容的大小,也就是可以滚动的大小,默认是0,没有滚动效果。
tracking 当 touch 后还没有拖动的时候值是YES,否则NO
zoomBouncing 当内容放大到最大或者最小的时候值是 YES,否则 NO
zooming 当正在缩放的时候值是 YES,否则 NO
decelerating 当滚动后,手指放开但是还在继续滚动中。这个时候是 YES,其它时候是 NO
decelerationRate 设置手指放开后的减速率
maximumZoomScale 个浮点数,表示能放最大的倍数
minimumZoomScale 个浮点数,表示能缩最小的倍数
pagingEnabled 当值是 YES 会自动滚动到 subview 的边界。默认是NO
scrollEnabled 决定是否可以滚动
showsHorizontalScrollIndicator 滚动时是否显示水平滚动条
showsVerticalScrollIndicator 滚动时是否显示垂直滚动条
bounces 默认是 yes,就是滚动超过边界会反弹有反弹回来的效果。假如是 NO,那么滚动到达边界会立刻停止。
bouncesZoom 和 bounces 类似,区别在于:这个效果反映在缩放上面,假如缩放超过最大缩放,那么会 反弹效果;假如是 NO,则到达最大或者最小的时候立即停止。
directionalLockEnabled 默认是 NO,可以在垂直和水平方向同时运动。当值是 YES 时,假如 开始是垂直或者是 水平运动,那么接下来会锁定另外 个方向的滚动。 假如 开始是对角方向滚动,则不会禁止 某个方向
indicatorStyle 滚动条的样式,基本只是设置颜色。总共3个颜色:默认、黑、白
scrollIndicatorInsets 设置滚动条的位置

UIScrollView代理方法

// scrollView已经滑动

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

// 视图已经放大或缩小

- (void)scrollViewDidZoom:(UIScrollView *)scrollView;

// scrollView开始拖动

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

// scrollView结束拖动

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

// scrollView开始减速(以下两个方法注意与以上两个方法加以区别)

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView; 

// scrollview减速停止

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

 // 返回 个放大或者缩小的视图

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

// 开始放大或者缩小

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView: (UIView *)view

// 缩放结束时

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView: (UIView *)view atScale:(float)scale;

// 是否支持滑动至顶部

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;

// 滑动到顶部时调用该方法

- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;

IOS工具篇-reveal

简介

Reveal 是一个界面调试工具。使用Reveal,我们可以在iOS开发时动态地查看和修改应用程序的界面。它类似Chrome的“审查元素”功能,我们不但可以在运行时看到iOS程序的界面层级关系,还可以实时地修改程序界面,不用重新运行程序就可以看到修改之后的效果。

reveal

配置方式一(推荐)

首先打开Terminal,输入vim ~/.lldbinit创建一个名为.lldbinit的文件,然后将如下内容输入到该文件中:

command alias reveal_load_sim expr (void*)dlopen("/Applications/Reveal.app/Contents/SharedSupport/iOS-Libraries/libReveal.dylib", 0x2);
command alias reveal_load_dev expr (void*)dlopen([(NSString*)[(NSBundle*)[NSBundle mainBundle]               pathForResource:@"libReveal" ofType:@"dylib"] cStringUsingEncoding:0    x4], 0x2);
command alias reveal_start expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter]           postNotificationName:@"IBARevealRequestStart" object:nil];
command alias reveal_stop expr (void)[(NSNotificationCenter*)[NSNotificationCenter defaultCenter]            postNotificationName:@"IBARevealRequestStop" object:nil];

该步骤其实是为lldb设置了4个别名,为了后续方便操作,这4个别名意义如下:

reveal_load_sim 为模拟器加载reveal调试用的动态链接库

reveal_load_dev 为真机加载reveal调试用的动态链接库

reveal_start 启动reveal调试功能

reveal_stop 结束reveal调试功能

Reveal连接模拟器

在AppDelegate类的application:didFinishLaunchingWithOptions:方法中,作如下3步操作(如下图所示):

6

1)点击该方法左边的行号区域,增加一个断点,之后右击该断点,选择“Edit Breakpoint”。

2)点击”Action”项边右的”Add Action”,然后输入“reveal_load_sim”

3)勾选上Options上的”Automatically continue after evaluating”选项。

Reveal连接真机

要用Reveal连接真机调试,我们需要先把Reveal的动态链接库上传到真机上。由于iOS设备有沙盒存在,所以我们只能将Reveal的动态链接库添加到工程中。

1)点击Reveal菜单栏的”Help”->”Show Reveal Library in Finder”选项,可以在Finder中显示出Reveal的动态链接库:libReveal.dylib

show-reveal-library-in-finder

2)调整libReveal.dylib的引用方式,这里我们只需要将libReveal.dylib文件拷贝到Sandbox中,但是我们在引入libReveal.dylib的时候Xcode默认是以Link Binary With Libraries的方式的,实际上应该是Copy Bundle Resources,所以应该先将libReveal.dylibLink Binary With Libraries中移除掉,然后在Copy Bundle Resources中添加。

3)安装之前处理模拟器的方式,将配置文件改成reveal_load_dev.

7

配置方式二

使用cocoaPods配置reveal

1)新建Podfile文件,并输入pod 'Reveal-iOS-SDK', :configurations => ['Debug']

8

2)在Terminal中切换到Podfile文件所在路径,pod install
3)退出xcode,打开*.xcworkspace文件

配置方式三

1)启动Reveal,选择Reveal -> Help -> Show Reveal Library in Finder。

show-reveal-library-in-finder

(2)在Xcode中打开iOS项目,将Reveal.framework拖到项目中,如果升级了Reveal,对应的Reveal.framework文件也要更新到对应的版本。

2

(3)在Xcode的Target -> Build Setting -> Other Linker Flags添加如下几个配置项
-ObjC -lz -framework Reveal

4

(4)运行项目,然后打开Reveal的界面,在左上角选择连接的设备

5

【第六章学习笔记】分栏控制器的基本概念和用法

UITabBarController 的基本概念

UINavigationController 和 UITabBarController(分栏控制器)一样是用来管理视图控制器的。前者管理视图控制器之间的导航,后者管理固定的几个视图控制器,子控制器是并列的,可以任意切换显示。

注意:UINavigationController 采用栈的方式来管理视图控制器,但 UITabBarController 在切换不同视图控制器的时候,是不会销毁视图的,除非内存告警,但是该视图的视图控制器依旧存在。

UITabBarController 的样式

qq20141025-1 2x

示例代码

/* 先声明和初始化视图控制器 */
UIViewController * vc1 = [[UIViewController alloc] init];
vc1.title = @"主页";

UIViewController * vc2 = [[UIViewController alloc] init];
vc2.view.backgroundColor = [UIColor redColor];
vc2.title = @"消息";

UIViewController * vc3 = [[UIViewController alloc] init];
vc3.view.backgroundColor = [UIColor grayColor];
vc3.title = @"搜索";

UIViewController * vc4 = [[UIViewController alloc] init];
vc4.view.backgroundColor = [UIColor brownColor];
vc4.title = @"设置";

NSArray * vcs = [NSArray arrayWithObjects: vc1, vc2, vc3, vc4, nil];
NSArray * vcs = @[vc1, vc2, vc3, vc4]; /* 更简洁的写法 */

UITabBarController * tc = [[UITabBarController alloc] init];
tc.viewControllers = vcs;

[self.window setRootViewController: tc];

UITabBarController 的结构

qq20141025-2 2x

与 UINavigationController 不同,UITabBarController 使用数组管理子视图控制器,并且子视图控制器之间是平等关系。

UITabBarController 类图分析

qq20141025-3 2x

我们已经知道一个 UITabBarController 控制着若干个由数组管理的视图控制器,一般最多显示 5 个,如果超过 5 个,则会出现一个 More 的按钮。

一个 UITabBarController 只有一个 UITabBar 视图,用于显示 UITabItem 视图,正如一个 UINavigationController 只有一个 UINavigationBar 视图,用于显示 UINavigationItem 视图。

如果子视图控制器想要设置 UITabBar 的话,就需要通过 UITabBarItem 来设置,它是每个子视图控制器都拥有的。正如 UINavigationController 中子视图控制器想要管理 UINavigationBar 的话,需要通过 UINavigationBarItem 来设置。

注意:UITabItem 不能拥有自定义视图,也就是无法自定义样式。使用的图片都会被转换成单色图。

UITabBarController 代理方法

/* 视图控制器将被选择 */
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;

/* 视图控制器已被选择 */
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;

UITabBarController 与 UINavigationController 的结合

一般是 UINavigationController 作为一个子视图控制器放在 UITabBarController 下。

qq20141025-4 2x

UITabBar 视图的组成

  • 用来控制子视图控制器的切换
  • 每个 Tab 控制一个视图控制器,点击哪个就显示对应的视图控制器
  • 每个 Tab 是个 UITabBarItem 对象,通过子视图控制器的 tabBarItem 属性可以访问该对象,通过 title 属性可以设置标题
  • 修改 UITabBar 的 tintColor 属性定义背景颜色

另外,通过 badgeValue 可以设置红色标记:

self.tabBarItem.badgeValue = @"New";

qq20141025-5 2x

也可以给程序图标设置:

[UIApplication sharedApplication].applicationIconBadgeNumber = 8;

qq20141025-6 2x

定制 UITabBar

隐藏 UITabBarController 的 UITabBar,然后创建一个 View 视图代替,在此 View 上添加 UIButton 代替 Tab 标签。

iOS 5.x 提供了新方法用于定义用户自己的 UITabBar:

@property(nonatomic, retain) UIImage * backgroundImage; /* 设置 UITabBar 背景图片 */
@property(nonatomic, retain) UIImage * selectionIndicatorImage; /* 设置选中图片 */

隐藏 UITabBar

self.hidesBottomBarWhenPushed = YES; /* UINavigationController 的子视图控制器中调用,必须在 init 方法中调用才能生效,而且隐藏后无法复原 */

分享机制及评分标准更新

现在的分享频率:

  • 一周一次 iOS 分享
  • 两周一次含 iOS 分享的其他分享

也就是说:一个月共有 4 次 iOS 分享,2 次其他分享。

评分标准:

  • iOS 作业分梯度评分(最高分16分),讲师当天的分享没有作业分。
  • 其他分享按照以前的做法:精彩和有用。

iOS 分享和平时的分享分开评分和排名:

  • iOS 分享一月一排名
  • 其他分享三月一排名

也就是说,iOS 每个月进行排名,最后一位缴 100,倒数第二位缴 50。其他分享每三个月进行一次排名(每个月2次分享,每次分享2个人,2_2_3 = 12 人,包括一些可能有三人同时分享的情况,所以确保三个月可以有 16 次分享,每个人可以分享两次。不需要严格按照三月一排名,只要分享够 16 次就可以了,同样:最后一位缴 100,倒数第二位缴 50)。

公平性:

  • 每次 iOS 分享,分享者和其他人作业的分数最高都是 16 分
  • 如果其他分享是一月一排名,就会有人不能分享,所以把时间拉宽一些。让每人都有两次分享的机会。

作业--微信列表界面

要求

1、完成滚动列表界面布局(不包含搜索条、底部tabbar、红点) ( 5分)
2、向左滑动时出现出现“取消关注”、“删除”按钮 (2分)
3、点击“取消关注”底部弹窗**(1分)**,点击“删除”按钮整行删除 (2分)

demo2

参考教程

oc版
http://study.163.com/course/courseMain.htm?courseId=418001#/courseDetail

swift版
http://www.maiziedu.com/course/ios/275-2596/
http://www.jikexueyuan.com/course/125.html

源码参考
https://github.com/daria-kopaliani/DAContextMenuTableViewController

【第一章学习笔记】oc语法与ios开发基础知识

数据类型

  1. 与js不同,oc中除了基本数据类型,还包括指针数据类型

    指针数据类型存放内存地址信息,指向内存的相应位置。

  2. js通常定义变量只需要用var来定义,不需要指定具体数据类型,常用的方式是:

var a=0;
var b="str";

而oc中在定义变量时,需要指定数据类型(常用的包括int、double、float、char、id等),比如:

int a=0;              // 整型
float b=3.14f;     // 浮点型
id c;              // 指针类型

另外,通过在这些数据类型前面添加限定词:long、long long、short、unsigned、signed 还可以改变数据类型的值域。

oc中类的声明与实现

// 类的声明,一般声明在.h文件中
@interface DemoClass:NSObject
{
   //实例变量声明
   int a;
}
- (id)initWithA:(int) _a;
@end

// 类的实现,一般声明在.m文件中
@implementation DemoClass
- (id) initWithA:(int) _a{
   [super init];
}
@end

// 类的初始化
DemoClass *demo=[[DemoClass alloc] init];// alloc和初始化方法一般不可或缺,alloc先分配内存再初始化相当于js的new

oc中的方法声明与调用

oc的方法主要有两种,一种是类方法,还有一种是实例方法。类方法是不需要实例化即可被调用的方法,实例方法是需要实例化才能使用的方法,在js中也有相似的例子

function Class=function(){};
Class.classMethod=function(){};  // 类方法声明
Class.prototype.method=function();//示例方法声明

Class.classMethod(); // 类方法调用
(new Class()).method(); // 示例方法调用

oc中的类方法和示例方法的声明和实现

@interface DemoClass:NSObject
// - 实例方法声明,
- (void) method: (int) argument; //void 为类的返回值类型,int为参数类型,该方法名为method:
// 类方法声明
+ (void) method2: (int) argument;
@end

DemoClass *demo=[[DemoClass alloc] init];
[demo method:0];// 调用实例方法
[DemoClass method2:0];// 调用类方法

类属性定义、获取和修改

oc中的类同样拥有属性,使用@property@synthesize可以让编译器自动生成设置器和访问器。

@interface DemoClass:NSObject{
  int argument;//声明属性
}
@property (nonatomic) int argument;//让编译器自动生成设置器和访问器
// nonatomic为属性类型,还有readonly、readwrite、assign、retain、copy、atomic
@end

@implementation DemoClass
@synthesize argument;//让编译器自动生成设置器和访问器
@end

// 属性设置器和访问器
DemoClass *demo=[[DemoClass alloc] init];
demo.argument=10;//设置器
NSLog(@"argument is :%d",demo.argument);//访问器

类目与协议

类目是对现有类的扩展,不需要继承,而且会成为原始类的一部分,可以像其他实例方法一样调用,而且这些类目方法一样可以被继承。

不过类目不能添加新的实例变量,而且如果类目覆盖原始类的现有方法,则会导致super消息的断裂,所以一般不建议覆盖现有方法。

类目就好像js中为Array扩展原型方法。

类目的定义:

@interface DemoClass (Cate) // 如果不带Cate ,则为匿名类目,也叫延展,相当于私有方法
- (void)method;
@end
// 实现
@implementation DemoClass (Cate)
- (void)method
{
   // TODO
}
@end

协议就好比接口,用于规定实现了该接口的类的接口规范(比如什么方法必须有,什么方法可选)

协议的定义

@protocol DemoProtocol <NSObject>
@required
- (void)method1;
@optional
- (void)method2;
@end

// 其他类对`DemoProtocol`协议的实现
@interface DemoClass : NSObject <DemoProtocol>
@end

//必须对method1进行实现
@implementation DemoClass
- (void)method1
{
   // TODO
}
@end

IOS生命周期

applicationWillResignActive(程序即将失去焦点)->
applicationDidEnterBackground(程序即将进入后台)->
applicationWillEnterForeground(程序即将进入前台)->
applicationDidBecomeActive(程序获得了焦点)->
applicationWillTerminate(程序即将退出)

实例练习

一个高富帅买了一辆中介介绍的30万的lexus。

demo已经上传到git:https://github.com/QQVIPTeam/practice-of-ios/tree/master/Class1/demo/Class1Demo1

第一章作业

做一个100秒倒计时的程序,注意考虑,程序进入后台的情况,大家按需加入其他功能。

完成后的作业已经上传到git:https://github.com/QQVIPTeam/practice-of-ios/tree/master/Class1/demo/timer

第一章作业二

做一个 App 状态的记录器,记录上面讲到的 iOS 生命周期(哪个时间进行了什么操作,如下示意),并显示到手机屏幕中。

13:23:01 --> applicationWillResignActive
13:41:22 --> applicationDidEnterBackground
13:43:51 --> applicationWillEnterForeground
13:50:11 --> applicationDidBecomeActive
13:55:21 --> applicationWillTerminate

作业示例已上传到这里:https://github.com/QQVIPTeam/practice-of-ios/tree/master/Class1/work/record

【第四章学习笔记】常用UI控件和常用类

各类常用控件

自 iOS7 推出扁平化风格之后,下面的控件几乎都变了样。

qq20141008-1 2x

UILabel(标签视图)

作用:显示文本

常用属性

  • tag
  • text
  • font (设置字体大小)
  • numberOfLines(文本行数)
  • textColor
  • shadowColor
  • shadowOffset
  • textAlignment (文本内容对齐方案)
  • lineBreakMode (文本超出范围时的截取方式)
  • backgroundColor
  • highlightedTextColor
  • highlighted (是否存在高亮,默认为 nil)
  • userInterationEnabled(交互是否打开,默认为 no)

实例代码

UILabel * label = [[UILabel alloc] initWithFrame: CGRectMake(200, 0, 100, 25)];
label.backgroundColor = [UIColor clearColor]; 
label.textAlignment = UITextAlignmentCenter;
label.font = [UIFont systemFontOfSize: 14.0f];
label.numberOfLines = 2;  /* 默认是 1 行,0 表示无限制 */
label.lineBreakMode = UILineBreakModeCharacterWrap;
[label sizeToFit]; /* 根据本文自动调整 label 的宽度和高度 */

UIControl

作用:具有事件处理的控件的父类

事件响应的三种形式:基于触摸、基于值、基于编辑
qq20141008-2 2x

常用方法

/* 添加一个事件 */
- (void)addTarget: (id)target action: (SEL)action forControlEvents: (UIControlEvents)controlEvents

/* 移除一个事件 */
- (void)removeTarget: (id)target action: (SEL)action forControlEvents: (UIControlEvents)controlEvents

控制视图的事件处理

  • UIControlEventTouchDown(用户按下时触发)
  • UIControlEventTouchDownRepeat(点击计数大于1时触发)
  • UIControlEventTouchDragInside(当触摸在控件内拖动时触发)
  • UIControlEventTouchDragOutside(当触摸在控件外拖动时触发)
  • UIControlEventTouchDragEnter(当触摸从控件之外拖动到内部时)
  • UIControlEventTouchDragExit(当触摸从控件之内拖动到外部时)
  • UIControlEventTouchUpInside(控件之内触摸抬起时)
  • UIControlEventTouchUpOutside(控件之外触摸抬起时)
  • UIControlEventTouchCancel(触摸取消事件,电话被上锁或者电话呼叫打断)
  • UIControlEventTouchValueChanged(当控件的值发生改变时。用于滑块、分段等控件)
  • UIControlEventEditingDidBegin(文本控件中开始编辑时)
  • UIControlEventEditingChanged(文本控件中文本被改变)
  • UIControlEventEditingDidEnd(文本控件中编辑结束时)
  • UIControlEventEditingDidOnExit(文本控件内通过按下回车键结束编辑时)
  • UIControlEventValueChanged(UISlider 值发生改变)
  • UIControlEventAllTouchEvents(所有触摸事件)
  • UIControlEventAllEditingEvents(文本编辑的所有事件)
  • UIControlEventAllEvents(所有事件)

UIButton

作用:响应用户的点击事件

常用方法

setTitle: (NSString *)title forState: (UIControlState)state;
setTitleColor: (UIColor *)color forState: (UIControlState)state;
setImage: (UIImage *)image forState: (UIControlState)state;
setBackgroundImage: (UIImage *)image forState: (UIControlState)state;
addTarget: (id)target action: (SEL)action forControlEvents: (UIControlEvents)controlEvents

可以发现每个方法都有 forState,它有几个值:

  • UIControlStateNormal(正常状态)
  • UIControlStateHighlighted(高亮状态)
  • UIControlStateDisabled(禁用状态)
  • UIControlStateSelected(选中状态)
  • UIControlStateApplication
  • UIControlStateReserved

UITextField

作用:文本输入控件,用于用户输入文字

常用属性

  • text
  • textColor
  • font
  • textAlignment
  • borderStyle(设置风格,默认没有风格,需要设置)
  • placeholder
  • clearsOnBeginEditing(编辑时清除内容,默认为 no)
  • adjustsFontSizeToFitWidth(调整字体大小来适应宽度)
  • delegate(设置代理)
  • background(设置背景图片,需要将风格设置�为 none)
  • disabledBackground
  • editing(设置是否可编辑)
  • clearButtonMode(清除按钮的模式,默认不出现)
  • leftView / rightView(自定义左右视图)
  • leftViewMode / rightViewMode(自定义左右视图的模式)
  • inputView(自定义键盘,不用系统键盘)
  • inputAccessoryView(系统键盘和自定义键盘共存)
  • autocapitalizationType(自动大写类型)
  • autocorrectionType(自动检查拼写)
  • keyboardType(键盘类型)
  • returnKeyType(键盘上的 return 按钮类型)
  • secureTextEntry(是否安全输入,是则显示为 * 号)

实例代码:

UITextFiled * tf = (UITextField *)[self.window viewWithTag: 1];
tf.borderStyle = UITextBorderStyleRoundedRect;

/* 将键盘作为第一响应者(点击其他地方可以移除键盘) */
[tf resignFirstResponder];

代理方法:

/* 将要开始输入时调用 */
- (BOOL)textFieldShoudBeginEditing: (UITextField *)textField {
    NSLog(@" 将要开始输入");
    return YES; /* NO 则唤起不了键盘 */
}

/* 开始输入时调用 */
- (BOOL)textFieldDidBeginEditing: (UITextField *)textField {
    NSLog(@"开始输入");
    return YES;
}

/* 将要结束时调用 */
- (BOOL)textFieldShoudEndEditing: (UITextField *)textField {
    NSLog(@" 将要输入结束");
    return YES;
}

/* 已经结束时调用 */
- (BOOL)textFieldDidEndEditing: (UITextField *)textField {
    NSLog(@"输入结束");
    return YES; /* NO 则收不回键盘 */
}

/* 内容改变事件 */
- (BOOL)textField: (UITextField *)textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *)string {
    NSLog(@"%@", string); /* 输出每次输入的字符串 */
    return YES; /* NO 则点了键盘输不出字符 */
}


/* 清除文字按钮事件 */
- (BOOL)textFieldShoudClear: (UITextField *)textField {
    NSLog(@"清除输入内容了");
    return YES;
}

/* 键盘上的 return 按钮 */
- (BOOL)textFieldShoudReturn: (UITextField *)textField {
    /* 隐藏输入键盘 */
    [textField resignFirstResponder];
    return YES;
}

UISlider

作用:控制系统声音,或者表示播放进度等

常用属性

  • value
  • minimumValue(设置最小值)
  • maximumValue
  • minimumValueImage(设置最小值图片)
  • maximumValueImage

示例代码

UISlider * slider = [[UISlider alloc] initWithFrame: CGRectMake(20, 0, 150, 25)];
slider.maximumValue = 100;
slider.minimumValue = 0; /* maximumValue 和 minimumValue 必须设置在 value 之前 */
slider.value = 50;

[slider setValue:50 animated: YES];
[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];

UISegmentedControl

作用:分段控件,页面的切换等。

示例代码

NSArray * array = [NSArray arrayWithObjects: @"选择", @"搜索", @"工具", nil]; /* 此处也可以是一个图片数组 */
UISegmentedControl * segmentCtrl = [[UISegmentedControl alloc] initWithItems: array];
segmentCtrl.frame = CGRectMake(20, 0, 150, 25);
segmentCtrl.segmentedControlStyle = UISegmentedControlStyleBar;
segmentCtrl.selectedSegmentIndex = 0;
[segmentCtrl addTarget:self action:@selector(segmentAction:) forControlEvents: UIControlEventValueChanged];

UIPageControl

作用:通常与 UIScrollView 连用,提示用户当前显示的页数

常用属性

  • numberOfPages
  • currentPage
  • hidesForSinglePage(只有一页时是否隐藏,默认 YES)

UIActivityIndicatorView(菊花)

常用属性和方法

  • activityIndicatorViewStyle(设置风格)
  • hidesWhenStopped
  • color
  • isAnimating
  • startAnimating(方法)
  • stopAnimating(方法)

系统状态栏中显示菊花的方法:

[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: YES];

UIAlertView

作用:警告视图(弹出框),提示用户,帮助用户选择

代码示例

/* 位置和尺寸不需要设置,默认有了 */
UIAlertView *alertview = [[UIAlertView alloc] initWithTitle: @"标题" message:@"提示文本信息" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", @"还可以有其他按钮" , nil];
[alertview show];

- (void)alertView: (UIAlertView *)alertView clickedButtonAtIndex: (NSInteger)buttonIndex {}

UIActionSheet

作用:警告视图(从下面网上弹出),提示用户,帮助用户选择

代码示例

/* 位置和尺寸不需要设置,默认有了 */
UIActionSheet *as = [[UIActionSheet alloc] initWithTitle: @"标题" message:@"提示文本信息" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"关闭" otherButtonTitles:@"还可以有其他按钮" , nil];

[as showInView: self.window];

- (void)actionSheet: (UIActionSheet *)actionSheet clickedButtonAtIndex: (NSInteger)buttonIndex {}

UIImageView

常用属性

  • image
  • highlighted
  • highlightedImage
  • userInteractionEnabled
  • initWithImage(方法)
  • initWithImage: (UIImage *)image highlightedImage: (UIImage *)highlightedImage(方法)

第四章作业

-2

评分标准:界面还原(4分),通过输入框下面的滑动条可以调节文本框字体大小(8分),自定义键盘,可快速插入颜文字(12分),若文本输入框没有内容,按下键盘的 return 键时弹出警告框(16分)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.