doproio / practice-of-ios Goto Github PK
View Code? Open in Web Editor NEWpractice-of-ios
practice-of-ios
UIWindow 的主要功能:一是提供一个区域来显示视图(UIView),二是将事件(event)分发给视图。一个应用至少有一个 UIWindow,大多数 iOS 应用程序在其生命周期内只有一个 UIWindow。虽然 iOS 支持将一个 UIWindow 放在其他 UIWindow 上方,但是你的应用程序永远不应该创建多个窗口,因为这会影响事件的传递。UIWindow 本身不具有任何可见的内容,但它对于视图提供了一个容器。
UIWindow 对象有以下职责:
每个 UIWindow 对象都有 windowLevel 属性,一般不应该去改变它,但是通过对其设置,可以做到隐藏状态栏等效果。self.window.windowLevel = UIWindowLevelStatusBar
。
在 iPhone 上所能看到的大部分控件都是 UIView 的子类。
iPhone 坐标系是以左上角为原点的,每一个 view 的 frame 所使用的坐标系以它的 父视图 的左上角为原点。
与视图坐标系相关的函数:
CGPoint point = CGPointMake(x, y);
CGSize size = CGSizeMake(w, h);
CGRect rect = CGRectMake(x, y, w, h);
Frame、Bounds 与 Center 属性
UIView 常用方法
addSubView: // 添加子视图
insertSubview: atIndex // 视图插入到指定索引位置
insertSubview:aboveSubview: // 视图插入指定视图之上
insertSubview:belowSubview: // 视图插入指定视图之下
bringSubviewToFront: // 把视图移动到最顶层
sendSubviewToBack: // 把视图移动到最底层
exchangeSubviewAtIndex:withSubviewAtIndex: // 把两个索引对应的视图调换位置
removeFromSuperview: // 把视图从父视图中移除
查找视图
UIView 常用属性
视图的 contentMode 决定了控件变化和缩放的方式,直接看图:
它的值有:
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit,
UIViewContentModeScaleAspectFill,
UIViewContentModeRedraw,
UIViewContentModeCenter,
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
对于超出的范围的内容,可以使用属性 uiview.clipsToBounds = YES
进行裁剪。
针对上面所说的 contentMode,实现一个界面,里面有一个图片容器、一个按钮和一行文本,按钮每次点击分别切换一种不同的 contentMode 并在文本中显示初具体的模式,目的是实现图片的填充缩放模式的切换浏览。类似下图:
导航控制器是以栈的形式来实现,一个视图控制器以入栈(push)的方式加入导航控制器,以出栈(pop)的方式移除,所以出栈以后,相应的视图控制器也将销毁。
导航控制器包括导航栏(NavigationBar)和底部工具栏(UIToolBar)两部分组成。
// 导航控制器初始化
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];
- (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
这张图清晰的描述了视图控制器的装载过程,有几个注意点:
整个视图控制器的生命周期依次如下:
当视图控制器add到window时,会依次调用viewWillAppear(视图将要渲染)和viewDidAppear(视图已经渲染好)
当内存警告时,会优先将不活跃的viewcontroller卸载掉。
可以通过模拟器来模拟内存警告。
事件响应跟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);
}
// 定义代理
@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实例
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 | 设置滚动条的位置 |
// 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;
Reveal 是一个界面调试工具。使用Reveal,我们可以在iOS开发时动态地查看和修改应用程序的界面。它类似Chrome的“审查元素”功能,我们不但可以在运行时看到iOS程序的界面层级关系,还可以实时地修改程序界面,不用重新运行程序就可以看到修改之后的效果。
首先打开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调试功能
在AppDelegate类的application:didFinishLaunchingWithOptions:方法中,作如下3步操作(如下图所示):
1)点击该方法左边的行号区域,增加一个断点,之后右击该断点,选择“Edit Breakpoint”。
2)点击”Action”项边右的”Add Action”,然后输入“reveal_load_sim”
3)勾选上Options上的”Automatically continue after evaluating”选项。
要用Reveal连接真机调试,我们需要先把Reveal的动态链接库上传到真机上。由于iOS设备有沙盒存在,所以我们只能将Reveal的动态链接库添加到工程中。
1)点击Reveal菜单栏的”Help”->”Show Reveal Library in Finder”选项,可以在Finder中显示出Reveal的动态链接库:libReveal.dylib
2)调整libReveal.dylib
的引用方式,这里我们只需要将libReveal.dylib
文件拷贝到Sandbox中,但是我们在引入libReveal.dylib
的时候Xcode默认是以Link Binary With Libraries
的方式的,实际上应该是Copy Bundle Resources
,所以应该先将libReveal.dylib
从Link Binary With Libraries
中移除掉,然后在Copy Bundle Resources
中添加。
3)安装之前处理模拟器的方式,将配置文件改成reveal_load_dev
.
1)新建Podfile文件,并输入pod 'Reveal-iOS-SDK', :configurations => ['Debug']
2)在Terminal中切换到Podfile文件所在路径,pod install
3)退出xcode,打开*.xcworkspace
文件
1)启动Reveal,选择Reveal -> Help -> Show Reveal Library in Finder。
(2)在Xcode中打开iOS项目,将Reveal.framework拖到项目中,如果升级了Reveal,对应的Reveal.framework文件也要更新到对应的版本。
(3)在Xcode的Target -> Build Setting -> Other Linker Flags添加如下几个配置项
-ObjC -lz -framework Reveal
(4)运行项目,然后打开Reveal的界面,在左上角选择连接的设备
#2016 IOS 第一期作业
1、UIScrollView控件的使用
2、UIScrollView结合UIPageControl
http://www.maiziedu.com/course/ios/18-2593/
最终效果如下图(完成页面切换即可,按钮点击效果不做要求)
UINavigationController 和 UITabBarController(分栏控制器)一样是用来管理视图控制器的。前者管理视图控制器之间的导航,后者管理固定的几个视图控制器,子控制器是并列的,可以任意切换显示。
注意:UINavigationController 采用栈的方式来管理视图控制器,但 UITabBarController 在切换不同视图控制器的时候,是不会销毁视图的,除非内存告警,但是该视图的视图控制器依旧存在。
/* 先声明和初始化视图控制器 */
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];
与 UINavigationController 不同,UITabBarController 使用数组管理子视图控制器,并且子视图控制器之间是平等关系。
我们已经知道一个 UITabBarController 控制着若干个由数组管理的视图控制器,一般最多显示 5 个,如果超过 5 个,则会出现一个 More 的按钮。
一个 UITabBarController 只有一个 UITabBar 视图,用于显示 UITabItem 视图,正如一个 UINavigationController 只有一个 UINavigationBar 视图,用于显示 UINavigationItem 视图。
如果子视图控制器想要设置 UITabBar 的话,就需要通过 UITabBarItem 来设置,它是每个子视图控制器都拥有的。正如 UINavigationController 中子视图控制器想要管理 UINavigationBar 的话,需要通过 UINavigationBarItem 来设置。
注意:UITabItem 不能拥有自定义视图,也就是无法自定义样式。使用的图片都会被转换成单色图。
/* 视图控制器将被选择 */
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController;
/* 视图控制器已被选择 */
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;
一般是 UINavigationController 作为一个子视图控制器放在 UITabBarController 下。
另外,通过 badgeValue 可以设置红色标记:
self.tabBarItem.badgeValue = @"New";
也可以给程序图标设置:
[UIApplication sharedApplication].applicationIconBadgeNumber = 8;
隐藏 UITabBarController 的 UITabBar,然后创建一个 View 视图代替,在此 View 上添加 UIButton 代替 Tab 标签。
iOS 5.x 提供了新方法用于定义用户自己的 UITabBar:
@property(nonatomic, retain) UIImage * backgroundImage; /* 设置 UITabBar 背景图片 */
@property(nonatomic, retain) UIImage * selectionIndicatorImage; /* 设置选中图片 */
self.hidesBottomBarWhenPushed = YES; /* UINavigationController 的子视图控制器中调用,必须在 init 方法中调用才能生效,而且隐藏后无法复原 */
现在的分享频率:
也就是说:一个月共有 4 次 iOS 分享,2 次其他分享。
评分标准:
iOS 分享和平时的分享分开评分和排名:
也就是说,iOS 每个月进行排名,最后一位缴 100,倒数第二位缴 50。其他分享每三个月进行一次排名(每个月2次分享,每次分享2个人,2_2_3 = 12 人,包括一些可能有三人同时分享的情况,所以确保三个月可以有 16 次分享,每个人可以分享两次。不需要严格按照三月一排名,只要分享够 16 次就可以了,同样:最后一位缴 100,倒数第二位缴 50)。
公平性:
1、完成滚动列表界面布局(不包含搜索条、底部tabbar、红点) ( 5分)
2、向左滑动时出现出现“取消关注”、“删除”按钮 (2分)
3、点击“取消关注”底部弹窗**(1分)**,点击“删除”按钮整行删除 (2分)
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
与js不同,oc中除了基本数据类型,还包括指针数据类型
。
指针数据类型存放内存地址信息,指向内存的相应位置。
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 还可以改变数据类型的值域。
// 类的声明,一般声明在.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的方法主要有两种,一种是类方法,还有一种是实例方法。类方法是不需要实例化即可被调用的方法,实例方法是需要实例化才能使用的方法,在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
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
自 iOS7 推出扁平化风格之后,下面的控件几乎都变了样。
作用:显示文本
常用属性:
实例代码:
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 的宽度和高度 */
作用:具有事件处理的控件的父类
常用方法:
/* 添加一个事件 */
- (void)addTarget: (id)target action: (SEL)action forControlEvents: (UIControlEvents)controlEvents
/* 移除一个事件 */
- (void)removeTarget: (id)target action: (SEL)action forControlEvents: (UIControlEvents)controlEvents
控制视图的事件处理:
作用:响应用户的点击事件
常用方法:
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
,它有几个值:
作用:文本输入控件,用于用户输入文字
常用属性:
实例代码:
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 * 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];
作用:分段控件,页面的切换等。
示例代码:
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];
作用:通常与 UIScrollView 连用,提示用户当前显示的页数
常用属性:
常用属性和方法:
系统状态栏中显示菊花的方法:
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible: YES];
作用:警告视图(弹出框),提示用户,帮助用户选择
代码示例:
/* 位置和尺寸不需要设置,默认有了 */
UIAlertView *alertview = [[UIAlertView alloc] initWithTitle: @"标题" message:@"提示文本信息" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", @"还可以有其他按钮" , nil];
[alertview show];
- (void)alertView: (UIAlertView *)alertView clickedButtonAtIndex: (NSInteger)buttonIndex {}
作用:警告视图(从下面网上弹出),提示用户,帮助用户选择
代码示例:
/* 位置和尺寸不需要设置,默认有了 */
UIActionSheet *as = [[UIActionSheet alloc] initWithTitle: @"标题" message:@"提示文本信息" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"关闭" otherButtonTitles:@"还可以有其他按钮" , nil];
[as showInView: self.window];
- (void)actionSheet: (UIActionSheet *)actionSheet clickedButtonAtIndex: (NSInteger)buttonIndex {}
常用属性:
评分标准:界面还原(4分),通过输入框下面的滑动条可以调节文本框字体大小(8分),自定义键盘,可快速插入颜文字(12分),若文本输入框没有内容,按下键盘的 return 键时弹出警告框(16分)
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.