博客总结 :
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
效果演示 :
博客相关资源地址 :