
博客总结 :
ViewController, 可在 ViewController 中的 Is Initial View Controller 选项中设置箭头是否指向本 ViewController ;IBAction 返回值方法 与 界面控件, 默认绑定 Touch Up Inside 事件; ② 右键选择按钮从 Send Events 列表中的按钮事件向代码拖线, 可以选择 将 按钮的指定事件 与 代码中的方法 进行关联; ③ 按住 control 键, 从控件拖到 ViewControler.m 空白处, 弹出生成方法对话框 生成对应事件绑定的方法;IBOutlet 修饰的属性 与 界面控件;TextField 控件的 Keyboard Type 属性;UITextField 的 resignFirstResponser 方法, ② 调用 根节点 [self.view endEditing:YES] 关闭根节点及其子节点触发的软键盘;Assets.xcassets 中;Custom, ② 按钮状态 Default, HighLighted , 分别可设置不同状态的 背景 文子 及 文子颜色 等属性; ③ 代码生成按钮 并 绑定事件 ( addTarget );UIClolr 的 colorWithRed:green:blue:alpha 方法中, 生成一个随机颜色值;博客相关资源 :
创建应用 :





运行应用 :



iPhone 模拟器控制 :

LaunchScreen.storyboard 界面 : 该界面不是用于展示应用程序的界面 ;

Main.storyboard 界面简介 :





Main.storyboard 界面机型设置 :


Storyboard Entry Point 简介 :

Main.storyboard 界面时, 先创建哪个 ViewController 控制器, 显示哪个控制器对应的 view 控件, 箭头所指的 ViewController 先进行初始化 并 显示对应的 控件;
storyboard 中可以有多个 ViewController, 右侧的对象库中, 第一个就是 ViewController 对象, 可以拖入到 storyboard 中, 拖入之后 storyboard 就有两个 ViewController , 但是箭头所指的是第一个, 那么界面显示的时候 首先显示的就是 第一个 ViewController 及其控制的控件;
箭头选中 :


ViewController 时, 可以将箭头从 ViewController 之间来回拖动, 切换 storyboard 界面 初始的 ViewController 控制器;

Storyboard Entry Point 对象, 选中该对象, 按下 Delete 键, 可删除该箭头;

箭头删除后 :

ViewController 然后打开属性查看器, 将 Is Initial View Controller 选项勾选, 此时 Storyboard Entry Point 对象就显示出来了, 界面中的箭头也显示出来了;

界面启动流程 : ① 解析 Deployment Info 程序中配置的程序入口 Storyboard, ② 根据 Storyboard Entry Point 箭头 指向创建 ViewController, ③ 创建 ViewController 控制的 根 节点 view 对象, ④ 创建其子节点 view 对象, 将这些子控件 按照级别添加到 根节点上;
Deployment Info 的其它配置信息 :
iOS UI 对象库 :

iOS 常用控件 :
UIView 简介 :
UIView 或 UIView 子类, 如 按钮 UIButton, 文字 UILabel 等都是继承自 UIView 的;
UIViewController 简介 :
UIView 是全屏控件的父容器, UIViewController 负责管理这个全屏的父容器 UIView ;UIViewController 负责 ① 管理 UIView 的生命周期 创建 显示 销毁, ② 监听 UIView 内部控件的事件响应, ③ 控制 UIView 与 用户之间的进行交互 ;
//
// ViewController.h
// Caculater
//
// Created by octopus on 18/5/8.
// Copyright © 2018年 han. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end//
// ViewController.m
// Caculater
//
// Created by octopus on 18/5/8.
// Copyright © 2018年 han. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end修改控件状态 : 通过修改对应 UI 对象的属性来修改控件的状态;
UILabel 显示的文字 就修改 text 属性, 修改 UIImageView 显示的图片 就修改 image 属性;UIView 中定义的, 而其他控件都是 UIView 的子类; UIProgressView 的 progress 属性代表其进度值, UILabel 和 UITextField 的 text 属性 代表其文本内容;frame 属性, 中心店位置 center 等属性, 这些属性都定义在 UIView 中,UIView 常用属性 :
superview 属性 : 获取父控件对象, UIView 中定义内容 @property(nonatomic,readonly) UIView *superview; ;
subviews 属性 : 获取子控件集合, UIView 中定义内容 @property(nonatomic,readonly,copy) NSArray *subviews; ;
tag 属性 : 控件标识属性, 父控件可以通过 tag 属性找到子控件, UIView 中定义内容 @property(nonatomic) NSInteger tag; ;
transform 属性 : 控件旋转缩放平移等操作属性, UIView 中定义内容 @property(nonatomic) CGAffineTransform transform; ;
frame 属性 : 控件 在 父控件 中的位置 和 尺寸, UIView 中定义内容 @property(nonatomic) CGRect frame; ;
bounds 属性 : 控件本身 所在矩形框的 位置 和 尺寸, 其中的位置就是 固定的 (0,0) 点, 尺寸就是矩形框大小, UIView 中定义内容 @property(nonatomic) CGRect bounds; ;
center 属性 : 控件中心点在 父控件 的位置, UIView 中定义内容 @property(nonatomic) CGPoint center; ;
UIView 坐标系 :

UIView 操作控件方法 :
- (void)addSubview:(UIView *)view; ;- (void)removeFromSuperview; ;- (UIView *)viewWithTag:(NSInteger)tag; ;控件 与 坐标系 :
frame 属性 的 位置 与 大小 : 注意该属性是相对于父控件的 位置 和 大小; 此时的父控件是界面的 根控件;


frame 属性是相对于父控件的 : 创建一个 view 控件, 将 label 控件放在 view 控件的左上角, 此时 label 控件的位置是 (0, 0), 大小不变;

代码创建按钮并绑定事件 :
参考本博客 一. 1. 章节, 有创建应用的过程说明 ;
需求 :

界面编辑 :




设置按钮响应事件 :
ViewController.h 中声明按钮的点击事件, 注意返回值必须是 IBAction 类型的 ;//声明计算方法
//① 这个 IBAction 相当于 void 类型
//② 只有返回值是 IBAction 类型才能与 Main.storyboard 进行交互
- (IBAction) caculate;ViewController.m 中实现该按钮的点击方法;//实现计算方法
//① 这个 IBAction 相当于 void 类型
//② 只有返回值是 IBAction 类型才能与 Main.storyboard 进行交互
- (IBAction) caculate{
NSLog(@"按钮点击");
}Main.storyboard 界面, 另一个现实 ViewController.h 代码界面, ② 将鼠标指针移动到 ViewController.h 界面中的按钮点击方法前的圆圈 
中, 此时圆圈会变成

, 此时**按住鼠标左键, 拖到按钮控件上**, 此时按钮控件与点击方法就关联起来了;


定义控件属性 : 如果要在 ViewController 中操作控件, 就需要在 ViewController 中定义该控件的对象;
@property (nonatomic, weak) IBOutlet UITextField * number1TextField; , 其中 @property 作用是生成其访问方法, 并制定该属性的指示符 nonatomic 代表该属性是 线程不安全 但是 性能高, weak 代表该属性是弱引用, 所有的控件都使用 weak 修饰; 属性 使用 IBOutlet 修饰 才能与 Main.storyboard 中的控件进行关联, 反之 没有左侧的 关联 符号; IBOutlet 只用标识该属性可以与 storyboard 进行连线;TextField 控件与 number1TextField 属性的连线, 过程与上面建立 按钮 与 点击 方法 关联的过程相同, ① 将鼠标移动到 ViewController.h 中的 IBOutlet 属性 左侧的圆圈, 此时该圆圈变为 加号, ② 按住鼠标左键, 拖到制定的控件处, 这样 ViewController.h 中的属性与 Main.storyboard 中的控件建立起了关联; 


建立连接后, 属性前的圆圈变为实心;

ViewController.h 中的属性与 Main.storyboard 中的属性;

ViewController.h 中定义 Label 属性 @property (nonatomic, weak) IBOutlet UILabel* resultLabel; , 除了类型 UILabel 与上面不同之外 其它一样;

软键盘设置 :
TextField 控件才会弹出虚拟机的软键盘;

Main.storyboard 中选中 TextField 控件, 选择 属性查看器, 设置其中的 keyboard Type, 设置为 Number Pad 数字键盘;


TextField 触发的, 通过对应的 TextField 控件 关闭键盘; ② 通过 父控件 关闭 软键盘; resignFirstResponder 方法 退出软键盘, 该方法只能关闭控件本身触发的软键盘, 示例 [self.textField resignFirstResponder] 关闭 textField 属性对应的控件触发的软键盘;view 的 endEditing 方法关闭软键盘; 代码 [self.view endEditing:YES] 关闭 view 控件 及其 子控件 触发的软键盘;实现计算逻辑 :
//实现计算方法
//① 这个 IBAction 相当于 void 类型
//② 只有返回值是 IBAction 类型才能与 Main.storyboard 进行交互
- (IBAction) caculate{
NSLog(@"按钮点击");
}NSString * number1Str = self.number1TextField.text; 使用 self. 方式访问 @property 修饰的成员变量, 即访问其自动生成的 getter 方法, number1TextField.text 是访问其 text 属性, 即用户输入的值;NSString 类型的 intValue 属性, 即可获取其 int 值, 将 NSString 类型转为了 int 类型; 代码为 int number1 = number1Str.intValue;;NSString 的 stringWithFormat 方法处理, [NSString stringWithFormat:@"%d", result] ;//实现计算方法
//① 这个 IBAction 相当于 void 类型
//② 只有返回值是 IBAction 类型才能与 Main.storyboard 进行交互
- (IBAction) caculate{
//1.获取 TextField 值
NSString * number1Str = self.number1TextField.text;
NSString * number2Str = self.number2TextField.text;
//2.将字符串值转为 int 类型, 并计算和
int number1 = number1Str.intValue;
int number2 = number2Str.intValue;
int result = number1 + number2;
//3.改变 Label 控件值, 注意要将 int 值转为 NSString 类型
self.resultLabel.text = [NSString stringWithFormat:@"%d", result];
}
参考本博客 一. 1. 章节, 有创建应用的过程说明 ;
需求 :

项目设置 : 设置屏幕大小, 拷贝需要用到的素材,
Main.storyboard 设计大小 : ① 进入 Main.storyboard 界面, 在文件查看器界面, 取消 Use Size Classes 勾选, 在弹出的对话框中 选择 iPhone 选项; ② 点击 ViewController, 在其属性查看器中, 选择对应的设计尺寸;


Assets.xcassets 中存放的, 开发时 直接将素材拖到 Assets.xcassets 界面的 左侧位置, 如下图 红框位置;

素材直接从 Finder 中拖到这里即可;

Main.storyboard 界面开发 : 放置按钮, 并设置按钮的背景图片;

Button 的 background 属性中设置图片名称, 然后图片就会显示在布局中;

Button 中的 tittle 属性设置按钮的文字, 下面的 Font 设置字体和大小, Text Color 设置文字颜色;

Text Color 属性, 会弹出一个列表, 可以选择少数几种颜色, 点击列表底部弹出一个 颜色板 可以选择任何颜色;

State Config 属性中可以配置 五种状态, 其中的 Highlighted 状态就是按钮按下的状态, 每个状态都可以设置一套单独的 Tittle Background 等属性, 如下图的属性列表;

State Config 切换到 Highlighted 状态, 此时可以设置 高亮状态下的按钮属性, 将 Background 中设置对应的按下的图片, 文字设置成按下的文字;

Highlighted 状态的 文字 和 背景图片, 此时无法看到, 可以在 Control 属性中勾选 Highlighted 属性, 此时就能查看高亮状态的 文字 和 背景图片了;

System 类型的属性, 会将 Highlighted 状态的图片默认设置成半透明, 这里为了避免这种情况, 需要 将 Type 属性设置为 Custom , 这样就可以自己定制按钮的属性了;


设置按钮高亮状态下的属性, 注意在 Control 中的 Content 属性需要勾选 Highlighted 选项才会显示下图的内容;

ViewController 中定义按钮对象 : 在 ViewController.m 中定义按钮属性, 并拖线关联该属性与 Main.storyboard 中的按钮控件; 定义内容 @property (nonatomic, weak) IBOutlet UIButton * mainButton; ;

CGRect 结构体介绍 : 其中 CGPoint 和 CGSize 都是一个结构体; 使用 typedef struct CGRect CGRect 语句重命名结构体类型之后, 结构体不用使用 struct CGRect frame 来定义结构体, 使用 CGRect frame 声明即可;
/* Points. */
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
/* Sizes. */
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
/* Rectangles. */
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;ViewController.m 中定义向上按钮的点击方法 : 这里注意 frame 是一个 CGRect 类型的结构体, 修改该结构体不能直接在对象中修改 如 self.mainButton.frame.origin.y = 0, 这种方法是错误的, 需要先将 frame 结构体取出来, 然后再操作赋值;//向上移动的方法
-(IBAction) up{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 向上移动 即 y 值减少, 每点击一下按钮y减少10
frame.origin.y -= 10;
//3.将结构体设置回 UIButton 对象
self.mainButton.frame = frame;
}Touch Up InSide 与上面定义的方法 : 右键点击控件, 在弹出的黑色对话框中找到 Touch Up Inside 方法, 点击方法后的圆圈, 直接拖到对应的方法上;

up 方法相同, 就是 修改 CGRect frame 结构体的 x y 递增 递减, 拖线关联按钮与方法;//向下移动的方法
-(IBAction) down{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 向上移动 即 y 值减少, 每点击一下按钮y减少10
frame.origin.y += 10;
//3.将结构体设置回 UIButton 对象
self.mainButton.frame = frame;
}
//向下移动的方法
-(IBAction) left{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 向上移动 即 y 值减少, 每点击一下按钮y减少10
frame.origin.x -= 10;
//3.将结构体设置回 UIButton 对象
self.mainButton.frame = frame;
}
//向下移动的方法
-(IBAction) right{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 向上移动 即 y 值减少, 每点击一下按钮y减少10
frame.origin.x += 10;
//3.将结构体设置回 UIButton 对象
self.mainButton.frame = frame;
}
frame 属性中的 size 结构体中的 width 和 height 值, 增加就是放大, 减少就是缩小; 拖入两个按钮并设置按钮的 Normal 和 Highlighted 状态的背景, 拖线关联 按钮与方法;//向下移动的方法
-(IBAction) big{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 宽高增加就是放大
frame.size.width += 10;
frame.size.height += 10;
//3.将结构体设置回 UIButton 对象
self.mainButton.frame = frame;
}
//向下移动的方法
-(IBAction) small{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 宽高减少就是缩小
frame.size.width -= 10;
frame.size.height -= 10;
//3.将结构体设置回 UIButton 对象
self.mainButton.frame = frame;
}tag 使用 :
Assets.xcassets 中创建一个目录 , 专门用于存放指定用途的 按钮背景图片资源 , 2 个按钮在 Default 和 Highlighted 两种状态的图片 ;







sender.tag 即可获取 UIButton 标签 , 根据 tag 执行不同的逻辑 ;控件关联的方法 , 是否传入 UIButton 控件 , 在于是否需要获取 按钮 相关资源 ,
关闭自动布局 : 如果 无法 控制 大小改变时 , 需要关闭自动布局 ;

transform ( 变换 ) 属性 :


CGAffineTransform 结构体 , 除了 传入的参数外 , 其它 都是默认值 ;/* Return a transform which translates by `(tx, ty)':
t' = [ 1 0 0 1 tx ty ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,
CGFloat ty)CGAffineTransform 结构体 , 除了 传入的参数外 , 其它 都是默认值 ;/* Return a transform which scales by `(sx, sy)':
t' = [ sx 0 0 sy 0 0 ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)CGAffineTransform 结构体 , 除了 传入的参数外 , 其它 都是默认值 ;/* Return a transform which rotates by `angle' radians:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] */
CG_EXTERN CGAffineTransform CGAffineTransformMakeRotation(CGFloat angle)CGAffineTransform 结构体 , 除了 传入的参数外 , 其它 都是默认值 ;/* Return the transform [ a b c d tx ty ]. */
CG_EXTERN CGAffineTransform CGAffineTransformMake(CGFloat a, CGFloat b,
CGFloat c, CGFloat d, CGFloat tx, CGFloat ty)CGAffineTransform 结构体变量 , 然后 根据 传入的 弧度值 , 修改 传入的 变量 , 因为是在原有基础上进行修改, 该修改 会 累加 ;/* Rotate `t' by `angle' radians and return the result:
t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ] * t */
CG_EXTERN CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,
CGFloat angle)- (IBAction)rotate:(UIButton *)sender {
//1. 获取要旋转的图片
CGAffineTransform rotateTransform = self.mainButton.transform;
//2. 获取修改旋转角度
switch (sender.tag) {
case 1:
rotateTransform = CGAffineTransformRotate(self.mainButton.transform, M_PI_2);
break;
case 2:
rotateTransform = CGAffineTransformRotate(self.mainButton.transform, -M_PI_2);
break;
default:
break;
}
//3.将 CGAffineTransform 结构体设置回 对象 , 并添加动画
[UIView animateWithDuration:1 animations:^{
self.mainButton.transform = rotateTransform;
}];
}代码示例 :
//
// ViewController.m
// 3.ButtonDemo
//
// Created by octopus on 18/6/9.
// Copyright © 2018年 han. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
//定义要操作的主要按钮, 即显示头像的按钮
@property (nonatomic, weak) IBOutlet UIButton * mainButton;
@end
@implementation ViewController
//向上移动的方法
-(IBAction) up{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 向上移动 即 y 值减少, 每点击一下按钮y减少10
frame.origin.y -= 10;
//3.将结构体设置回 UIButton 对象 , 使用 block 动画效果
[UIView animateWithDuration:1 animations:^{
self.mainButton.frame = frame;
}];
}
//向下移动的方法
-(IBAction) down{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 向上移动 即 y 值减少, 每点击一下按钮y减少10
frame.origin.y += 10;
//3.将结构体设置回 UIButton 对象
[UIView animateWithDuration:1 animations:^{
self.mainButton.frame = frame;
}];
}
//向下移动的方法
-(IBAction) left{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 向上移动 即 y 值减少, 每点击一下按钮y减少10
frame.origin.x -= 10;
//3.将结构体设置回 UIButton 对象
[UIView animateWithDuration:1 animations:^{
self.mainButton.frame = frame;
}];
}
//向下移动的方法
-(IBAction) right{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 向上移动 即 y 值减少, 每点击一下按钮y减少10
frame.origin.x += 10;
//3.将结构体设置回 UIButton 对象
[UIView animateWithDuration:1 animations:^{
self.mainButton.frame = frame;
}];
}
//向下移动的方法
-(IBAction) big{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 宽高增加就是放大
frame.size.width += 10;
frame.size.height += 10;
frame.origin.x -= 5;
frame.origin.y -= 5;
//3.将结构体设置回 UIButton 对象
[UIView animateWithDuration:1 animations:^{
self.mainButton.frame = frame;
}];
}
//向下移动的方法
-(IBAction) small{
//注意点 : OC 中不能直接 修改 对象的结构体成员,
// 如果有此类需求, 需要先取出结构体, 修改结构体成员, 在将结构体赋值给对象
//1.取出 frame 结构体
CGRect frame = self.mainButton.frame;
//2.修改结构体中的成员, 宽高减少就是缩小
frame.size.width -= 10;
frame.size.height -= 10;
frame.origin.x += 5;
frame.origin.y += 5;
//3.将结构体设置回 UIButton 对象
[UIView animateWithDuration:1 animations:^{
self.mainButton.frame = frame;
}];
}
- (IBAction)rotate:(UIButton *)sender {
//1. 获取要旋转的图片
CGAffineTransform rotateTransform = self.mainButton.transform;
//2. 获取修改旋转角度
switch (sender.tag) {
case 1:
rotateTransform = CGAffineTransformRotate(self.mainButton.transform, M_PI_2);
break;
case 2:
rotateTransform = CGAffineTransformRotate(self.mainButton.transform, -M_PI_2);
break;
default:
break;
}
//3.将 CGAffineTransform 结构体设置回 对象 , 并添加动画
[UIView animateWithDuration:1 animations:^{
self.mainButton.transform = rotateTransform;
}];
}
@end
效果展示:

参考本博客 一. 1. 章节, 有创建应用的过程说明 ;
设置大小 : 在 Main.storyboard 选中 UIViewController 打开属性查看器, 调节 Simulated Metrics 中的大小为 IPhone5.5-inch, 这样 Main.storyboard 就会显示成普通 iPhone 的样式;
需求 :
UIView 控件;UIView 控件, 并设置动画;UIButton 控件, 并绑定点击事件;拖线生成传入 Sender 的方法:
UIView 控件到界面中, 并打开尺寸查看器, 将其大小修改为 300 x 300 , 放置在中心位置;

UIView 控件中, 修改文字为 改变颜色; 这里尝试一种新的方法来进行按钮点击方法设置; Main.storyboard, 另一个显示 ViewController.m 文件;


changeColor, 类型为 UIButton, 事件为 Touch Up Inside, 传入的参数暂时设置为 Sender 这里需要将 按钮本身传回, 用于获取其父控件 ; 点击 Connect 按钮, 就会自动生成方法;


设置颜色 及 随机 颜色值 :
UIView * superView = sender.superview; ;backgroundColor , 修改该属性即可改变父控件颜色; 代码为 superView.backgroundColor = [UIColor blueColor]; ; 上述代码将父控件背景颜色修改为 蓝色;UIButton控件 : 添加一个 UIButton 控件, 修改标题为 “修改随机颜色” 从控件到 UIViewController.m 中拖线, 点击方传入 Sender , 参数如下设置; 生成的方法为 - (IBAction)changeRandomColor:(UIButton *)sender{} ;

UIView * superView = sender.superview; ;UIColor 的 colorWithRed:green:blue:alpha 方法, 该方法的参数传入 一个 0 ~ 1 之间的随机值, 类型为 float 类型; alpha 透明度设置为 1;arc4random_uniform() 方法, 代码为 arc4random_uniform(255) ; 使用 arc4random_uniform(255) / 255.0 即可 获得一个 0 ~ 1 之间随机 浮点数; //2. 获取一个随机颜色
// colorWithRed:green:blue:alpha 方法传入的参数取值范围 0 ~ 1 的浮点数
// 获取 0 ~ 1 之间的随机数, arc4random_uniform(255) 是 C 语言方法, 获取 0 ~ 254 随机值
// 注意 : 除数要是 float 类型 255.0, 否则两个整型相除会按照整型计算
float randomRed = arc4random_uniform(255) / 255.0;
float randomGreen = arc4random_uniform(255) / 255.0;
float randomBlue = arc4random_uniform(255) / 255.0;
UIColor * randomColor = [UIColor colorWithRed:randomRed green:randomGreen blue:randomBlue alpha:1];superView, 因此修改父控件代码为 superView.backgroundColor = randomColor; ;- (IBAction)changeRandomColor:(UIButton *)sender {
//1. 获取按钮的父控件
UIView * superView = sender.superview;
//2. 获取一个随机颜色
// colorWithRed:green:blue:alpha 方法传入的参数取值范围 0 ~ 1 的浮点数
// 获取 0 ~ 1 之间的随机数, arc4random_uniform(255) 是 C 语言方法, 获取 0 ~ 254 随机值
// 注意 : 除数要是 float 类型 255.0, 否则两个整型相除会按照整型计算
float randomRed = arc4random_uniform(255) / 255.0;
float randomGreen = arc4random_uniform(255) / 255.0;
float randomBlue = arc4random_uniform(255) / 255.0;
UIColor * randomColor = [UIColor colorWithRed:randomRed green:randomGreen blue:randomBlue alpha:1];
//3. 修改父控件颜色
superView.backgroundColor = randomColor;
}代码生成 View 控件 :
Main.storyboard 中添加一个按钮, 修改按钮文字为 “代码生成UIView控件”, 进入辅助编辑器模式, 按下 control 键不放, 左键拖动按钮到 ViewController.m 中, 在弹出的对话框中进行如下设置; 生成方法 为 - (IBAction)generateView:(UIButton *)sender {} ; 
generateView, 控件类型为 UIButton, 事件为 Touch Up Inside, 参数为 Sender 即 按钮本身;

UIView 传入 UIViewController.m 中 : 按住 control 不放, 左键拖动 白色的 UIView 控件, 拖动到 ViewController.m 的扩展中;

mainView, 引用为 weak 弱引用;

UIView 对象 : 首先创建一个 UIView 对象, 代码为 UIView * generateView = [[UIView alloc] init]; ;CGRect 结构体变量 : 使用 CGRectMake 方法创建 CGRect 结构体, CGRectMake(0, 0, 100, 100); ;UIView 对象 backgroundColor 与 frame 属性 : 如果不设置这两个属性, 那么创建的 View 控件就会看不清; //2. 设置 UIView 对像的 颜色值 和 位置大小属性
generateView.backgroundColor = [UIColor blueColor];
generateView.frame = CGRectMake(0, 0, 100, 100);UIView 控件到界面中 : 将控件添加到之前设置的 mainView 中, [self.mainView addSubview:generateView]; ;UIView 控件代码 :- (IBAction)generateView:(UIButton *)sender {
//1. 创建 UIView 对象
UIView * generateView = [[UIView alloc] init];
//2. 设置 UIView 对像的 颜色值 和 位置大小属性
generateView.backgroundColor = [UIColor blueColor];
generateView.frame = CGRectMake(0, 0, 100, 100);
//3.添加到 mainView 中
[self.mainView addSubview:generateView];
}
控件动画设置 :
UIButton 控件 到 ViewController.m 中, 在弹出的对话框中设置对应参数, 方法名, 控件类型, 参数 等; 生成的代码 - (IBAction)generateMovingView:(UIButton *)sender {} ;


UIView 的 beginAnimations:context 方法, ② 设置动画的各种属性, 如 设置动画过程 setAnimationDuration, 设置动画延迟 setAnimationDelay, ③ 设置控件的改变, 如 frame 属性的 位置 大小 改变, ④ 提交动画 , [UIView commitAnimations]; 这种头尾式动画 代码量过大, 用法比较少; //头尾式动画, 开始动画, 并设置动画的属性, 很少使用
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
[UIView setAnimationDelay:1];
generateView.frame = frame;
[UIView commitAnimations];UIView 的 animateWithDuration:animations 方法, 动画改变内容设置在 block 代码块中; //Block 动画, 常用
[UIView animateWithDuration:2 animations:^{
generateView.frame = frame;
}];- (IBAction)generateMovingView:(UIButton *)sender {
//1. 创建 UIView 并设置尺寸
UIView * generateView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
//2. 设置 UIView 背景颜色
generateView.backgroundColor = [UIColor greenColor];
//3. 将创建的 UIView 添加到 mainView 中去;
[self.mainView addSubview:generateView];
//4. 获取 frame 属性, 并修改其位置, 向右移动 100 像素
CGRect frame = generateView.frame;
frame.origin.x = 100;
//5. 头尾式动画, 开始动画, 并设置动画的属性, 很少使用
/*
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
[UIView setAnimationDelay:1];
generateView.frame = frame;
[UIView commitAnimations];
*/
//5. Block 动画, 常用
[UIView animateWithDuration:2 animations:^{
generateView.frame = frame;
}];
}代码生成按钮 :
UIButton 对象, 调用 [UIButton buttonWithType:UIButtonTypeCustom] 创建一个按钮, 同时指定按钮的类型为 Custom 类型, 一般我们使用的按钮类型都是 该类型的 ; 每个控件必须设置 frame 属性, 这里使用 CGRectMake 方法创建一个 CGRect 结构体变量, 代码为 [button setFrame:CGRectMake(0, 0, 100, 100)]; ;setTitle:forState 为某个状态指定文字, 这里 [button setTitle:@"普通状态" forState:UIControlStateNormal]; 为普通状态指定文字, [button setTitle:@"按下状态" forState:UIControlStateHighlighted]; 为高亮状态指定文字; ② 调用 setTitleColor:forState 为某种状态指定文字颜色, [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 为普通状态指定文字颜色, [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; 为高亮状态指定文字颜色;[UIImage imageNamed:@"bg.png"]; 可以获取 UIImage 对象; ② 设置按钮的背景图片属性 [button setBackgroundImage:image forState:UIControlStateNormal]; ;addSubView 方法即可, [self.mainView addSubview:button]; ;UIButton 的 addTarget 方法为按钮添加点击事件, [button addTarget:self action:@selector(generateButtonThing) forControlEvents:UIControlEventTouchUpInside];, 其中 action 参数设置点击事件名称, forControlEvents 参数设置绑定的按钮事件;//生成一个按钮并绑定事件
- (IBAction)generateButton:(UIButton *)sender {
//1.创建 UIButton 按钮, 创建按钮时需要制定按钮的 Type 类型, 一般情况下使用 Custom 类型, 并设置图片的 frame 属性
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:CGRectMake(0, 0, 100, 100)];
//2.设置按钮的文字内容 与 文字样式
[button setTitle:@"普通状态" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitle:@"按下状态" forState:UIControlStateHighlighted];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
//3. 设置普通状态的背景图片, 如果图片后缀是 png 或 jpg 格式, 可以只写图片名称
UIImage * image = [UIImage imageNamed:@"bg.png"];
[button setBackgroundImage:image forState:UIControlStateNormal];
//4. 将按钮添加到 mainView 中
[self.mainView addSubview:button];
//5. 为按钮添加点击事件
[button addTarget:self action:@selector(generateButtonThing) forControlEvents:UIControlEventTouchUpInside];
}
- (void) generateButtonThing{
NSLog(@"generateButtonThing");
}完整代码 :
//
// ViewController.m
// 4.UIViewColor
//
// Created by octopus on 18/6/11.
// Copyright © 2018年 han. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIView *mainView;
@end
@implementation ViewController
//修改 按钮牛所在的 父控件 View 控件颜色
- (IBAction)changeColor:(UIButton *)sender {
//1. 获取按钮的父控件
UIView * superView = sender.superview;
//2. 修改父控件颜色
superView.backgroundColor = [UIColor blueColor];
}
- (IBAction)changeRandomColor:(UIButton *)sender {
//1. 获取按钮的父控件
UIView * superView = sender.superview;
//2. 获取一个随机颜色
// colorWithRed:green:blue:alpha 方法传入的参数取值范围 0 ~ 1 的浮点数
// 获取 0 ~ 1 之间的随机数, arc4random_uniform(255) 是 C 语言方法, 获取 0 ~ 254 随机值
// 注意 : 除数要是 float 类型 255.0, 否则两个整型相除会按照整型计算
float randomRed = arc4random_uniform(255) / 255.0;
float randomGreen = arc4random_uniform(255) / 255.0;
float randomBlue = arc4random_uniform(255) / 255.0;
UIColor * randomColor = [UIColor colorWithRed:randomRed green:randomGreen blue:randomBlue alpha:1];
//3. 修改父控件颜色
superView.backgroundColor = randomColor;
}
- (IBAction)generateView:(UIButton *)sender {
//1. 创建 UIView 对象
UIView * generateView = [[UIView alloc] init];
//2. 设置 UIView 对像的 颜色值 和 位置大小属性
generateView.backgroundColor = [UIColor blueColor];
generateView.frame = CGRectMake(0, 0, 100, 100);
//3.添加到 mainView 中
[self.mainView addSubview:generateView];
}
- (IBAction)generateMovingView:(UIButton *)sender {
//1. 创建 UIView 并设置尺寸
UIView * generateView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
//2. 设置 UIView 背景颜色
generateView.backgroundColor = [UIColor greenColor];
//3. 将创建的 UIView 添加到 mainView 中去;
[self.mainView addSubview:generateView];
//4. 获取 frame 属性, 并修改其位置, 向右移动 100 像素
CGRect frame = generateView.frame;
frame.origin.x = 100;
//5. 头尾式动画, 开始动画, 并设置动画的属性, 很少使用
/*
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2];
[UIView setAnimationDelay:1];
generateView.frame = frame;
[UIView commitAnimations];
*/
//5. Block 动画, 常用
[UIView animateWithDuration:2 animations:^{
generateView.frame = frame;
}];
}
//生成一个按钮并绑定事件
- (IBAction)generateButton:(UIButton *)sender {
//1.创建 UIButton 按钮, 创建按钮时需要制定按钮的 Type 类型, 一般情况下使用 Custom 类型, 并设置图片的 frame 属性
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:CGRectMake(0, 0, 100, 100)];
//2.设置按钮的文字内容 与 文字样式
[button setTitle:@"普通状态" forState:UIControlStateNormal];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitle:@"按下状态" forState:UIControlStateHighlighted];
[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
//3. 设置普通状态的背景图片, 如果图片后缀是 png 或 jpg 格式, 可以只写图片名称
UIImage * image = [UIImage imageNamed:@"bg.png"];
[button setBackgroundImage:image forState:UIControlStateNormal];
//4. 将按钮添加到 mainView 中
[self.mainView addSubview:button];
//5. 为按钮添加点击事件
[button addTarget:self action:@selector(generateButtonThing) forControlEvents:UIControlEventTouchUpInside];
}
- (void) generateButtonThing{
NSLog(@"generateButtonThing");
}
@end效果演示 :

博客相关资源地址 :