一、 基础视图容器:UIView

UIView 是 UIKit 中所有可视化组件的 基类(如 UILabel、UIButton 均继承自 UIView),本质是一个矩形区域,主要作用是作为「容器」承载子视图,或作为「基础视图」展示纯色、处理触摸事件。

1.1 核心功能

  • 作为视图层级的基础节点,管理子视图(添加、删除、调整层级);
  • 定义自身的位置、大小、背景色等视觉属性;
  • 接收并传递用户触摸事件(如点击、滑动)。

1.2 关键属性与方法

类别 属性/方法 作用说明
布局相关 frame 定义视图在父视图中的「绝对位置」和大小(x: 横坐标,y: 纵坐标,width/height: 宽高)
center 定义视图的中心点在父视图中的位置(会覆盖 frame 的 x/y 偏移,优先控制中心)
视觉相关 backgroundColor 设置视图背景色(如 UIColor.blue
层级管理 addSubview(_:) 将当前视图添加到父视图的子视图列表(父视图需先加载,如 self.view.addSubview(firstView)
屏幕信息 UIScreen.main.bounds.size 获取当前设备屏幕的尺寸(宽高),用于适配不同设备屏幕

1.3 代码逻辑解析

// 1. 获取屏幕尺寸:适配不同设备(如iPhone 15与iPhone SE)
let fullScreenSize = UIScreen.main.bounds.size 

// 2. 创建UIView:通过frame设置初始位置(x=0,y=0)和大小(100x100)
let firstView = UIView(frame:CGRect(x:0,y:0,width:100,height:100)) 

// 3. 设置视觉属性:背景色为蓝色
firstView.backgroundColor = UIColor.blue 

// 4. 调整位置:将视图中心点移到屏幕正中央(覆盖frame的x/y)
firstView.center = CGPoint(x: fullScreenSize.width / 2,y: fullScreenSize.height / 2) 

// 5. 加入父视图:只有添加到父视图(如ViewController的view)才会显示
self.view.addSubview(firstView) 

在这里插入图片描述

1.4 注意事项

  • frame 布局局限性:代码中使用 frame 是「绝对布局」,当设备旋转、屏幕尺寸变化时,视图位置会错乱,实际开发中建议用 AutoLayout;
  • 视图显示条件:视图必须满足两个条件才会显示:① 加入父视图层级;② isHidden 属性为 false(默认 false);
  • 层级优先级:后添加的子视图(addSubview 调用顺序靠后)会覆盖先添加的视图,可通过 bringSubviewToFront(_:) 调整层级。

二、文本展示组件:UILabel

UILabel 是专门用于展示静态文本的组件,继承自 UIView,支持文本样式(颜色、字体、对齐方式)、多行显示、阴影效果等配置,是 App 中最常用的文本展示工具(如标题、说明文字)。

2.1 核心功能

  • 展示固定文本(不可编辑,如需编辑需用 UITextField/UITextView);
  • 自定义文本字体、颜色、对齐方式、行间距;
  • 支持多行文本与文本截断(如超出长度显示 ...);
  • 添加文本阴影效果。

2.2 关键属性与方法

类别 属性/方法 作用说明
文本内容 text 设置显示的文本(如 myLabel.text = "Swift起步走"
文本样式 textColor 设置文本颜色(如 UIColor.red
font 设置字体(系统字体 UIFont.systemFont(ofSize: 36) 或自定义字体)
textAlignment 文本对齐方式(.left/.center/.right,可省略 NSTextAlignment 前缀)
多行与截断 numberOfLines 最大显示行数(1 为单行,2 为两行,0 为自动换行)
lineBreakMode 文本截断模式(如 .byTruncatingTail 为末尾显示 ...
阴影效果 shadowColor 阴影颜色(如 .gray
shadowOffset 阴影偏移量(CGSize(width: 2, height: 2) 表示右下偏移)
布局相关 bounds 定义视图自身的「相对位置」和大小(x/y 相对于自身,通常设为 0,仅调整宽高)

2.3 代码逻辑解析

// 1. 创建UILabel:初始frame(后续通过bounds调整大小,center调整位置)
let myLabel = UILabel(frame:CGRect(x: 0, y: 0, width: 300, height: 80))

// 2. 文本基础配置
myLabel.text = "Swift起步走"       // 文本内容
myLabel.textColor = UIColor.red   // 文本红色
myLabel.textAlignment = .center   // 文本居中

// 3. 字体配置:注意!代码中`myLabel.font.withSize(40)`不生效,需重新赋值
myLabel.font = UIFont.systemFont(ofSize: 36)  // 先设系统字体(36号)
myLabel.font = myLabel.font.withSize(40)      // 修正:重新赋值为40号字体

// 4. 多行与截断:支持2行,超出末尾显示...
myLabel.numberOfLines = 2
myLabel.lineBreakMode = .byTruncatingTail

// 5. 阴影效果:灰色阴影,右下偏移2pt
myLabel.shadowColor = .gray
myLabel.shadowOffset = CGSize(width: 2, height: 2)

// 6. 调整大小与位置:通过bounds设宽高,center设屏幕中央
myLabel.bounds.size.width = 250    // 自身宽250pt
myLabel.bounds.size.height = 250   // 自身高250pt
myLabel.center = CGPoint(x: fullScreenSize.width / 2, y: fullScreenSize.height / 2)

// 7. 背景色与显示:黑色背景,加入父视图
myLabel.backgroundColor = .black
self.view.addSubview(myLabel)

在这里插入图片描述

2.4 注意事项

  • 字体生效问题UIFont.withSize(_:) 方法不会修改原字体,而是返回一个新字体对象,必须重新赋值给 font 属性才会生效
  • 多行文本高度计算:若 numberOfLines = 0(自动换行),需通过 sizeThatFits(CGSize) 计算文本实际高度,避免文本被截断;
  • 自定义字体导入:若使用非系统字体(如 “Helvetica-Light”),需先将字体文件导入项目,并在 Info.plist 中配置 Fonts provided by application,否则字体不生效。

三、单行文本输入组件:UITextField

UITextField 是用于单行文本输入的组件(继承自 UIControl),支持占位提示、键盘样式自定义、输入内容清除、代理回调(如回车事件),适用于账号、密码、邮箱等短文本输入场景。

3.1 核心功能

  • 提供单行文本输入框,支持占位提示(placeholder);

  • 自定义键盘样式(如邮箱键盘、数字键盘);

  • 输入时显示「清除按钮」(一键删除内容);

  • 通过代理(UITextFieldDelegate)处理输入回调(如回车隐藏键盘)。

3.2 关键属性与方法

类别 属性/方法 作用说明
输入提示 placeholder 输入为空时的提示文本(如 "請輸入文字"),默认灰色
边框样式 borderStyle 输入框边框样式(如 .roundedRect 为圆角矩形边框)
清除按钮 clearButtonMode 清除按钮显示时机(如 .whileEditing 为编辑时显示)
键盘配置 keyboardType 键盘样式(如 .emailAddress 为邮箱键盘,含 @.
returnKeyType 回车键样式(如 .done 为「完成」按钮)
视觉样式 textColor/backgroundColor 输入文本颜色、输入框背景色
代理机制 delegate 设置代理对象(需遵循 UITextFieldDelegate 协议),处理输入回调
键盘隐藏 view.endEditing(true) 结束当前视图的编辑状态,隐藏键盘(通常在回车事件中调用)

3.3 代码逻辑解析

// 1. 遵循代理协议:ViewController需实现UITextFieldDelegate
class ViewController: UIViewController, UITextFieldDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 2. 创建UITextField:初始大小200x50
        let myTextField = UITextField(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
        
        // 3. 输入提示与边框
        myTextField.placeholder = "請輸入文字"  // 占位提示
        myTextField.borderStyle = .roundedRect  // 圆角边框
        
        // 4. 输入辅助配置
        myTextField.clearButtonMode = .whileEditing  // 编辑时显示清除按钮
        myTextField.keyboardType = .emailAddress     // 邮箱键盘
        myTextField.returnKeyType = .done           // 回车显示「完成」
        
        // 5. 视觉样式
        myTextField.textColor = .white        // 白色输入文本
        myTextField.backgroundColor = .lightGray  // 浅灰背景
        
        // 6. 代理设置:关键!让ViewController处理输入回调
        myTextField.delegate = self
        
        // 7. 位置:屏幕中上部(y=屏幕高度30%处)
        myTextField.center = CGPoint(x: fullScreenSize.width * 0.5, y: fullScreenSize.height * 0.3)
        
        // 8. 加入父视图
        self.view.addSubview(myTextField)
    }
    
    // 9. 代理方法:点击回车键时调用
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        self.view.endEditing(true)  // 隐藏键盘
        return true
    }
}

在这里插入图片描述

3.4 注意事项

  • 代理协议必须遵循:若未在 class 后添加 UITextFieldDelegate,直接设置 delegate = self 会报错;
  • 键盘隐藏的其他方式:除了 view.endEditing(true),还可调用 textField.resignFirstResponder()(仅隐藏当前输入框的键盘);
  • 输入内容校验:可通过代理方法 textField(_:shouldChangeCharactersIn:replacementString:) 实时校验输入内容(如限制只能输入数字);
  • 密码隐藏:若为密码输入框,需设置 myTextField.isSecureTextEntry = true(输入内容显示为 )。

四、多行文本输入组件:UITextView

UITextView 是用于多行文本输入/展示的组件(继承自 UIScrollView),支持换行输入、文本选择、自定义菜单(如复制、粘贴),适用于备注、评论、长文本编辑等场景,功能比 UITextField 更灵活。

4.1 核心功能

  • 支持多行文本输入与自动滚动(因继承 UIScrollView,文本超出视图大小时可滚动);
  • 允许文本选择、复制、粘贴,支持自定义菜单(如代码中的「寄送」「FB」);
  • 可配置文本是否可编辑(isEditable)、是否可选择(isSelectable);
  • 通过手势识别隐藏键盘(解决无回车键的问题)。

4.2 关键属性与方法

类别 属性/方法 作用说明
文本内容 text 设置初始文本(如 "Swift 起步走"
文本样式 textColor/font/textAlignment 文本颜色、字体、对齐方式(与 UILabel 一致)
编辑控制 isEditable 是否可编辑(true 为可输入,false 仅展示)
isSelectable 是否可选择文本(false 则无法复制)
键盘配置 keyboardType/returnKeyType 键盘样式、回车键样式(与 UITextField 一致)
自定义菜单 UIMenuController 添加自定义菜单选项(如代码中的「寄送」「FB」)
手势隐藏键盘 UITapGestureRecognizer 给父视图添加点击手势,点击空白处隐藏键盘

4.3 代码逻辑解析

class ViewController: UIViewController {
    // 1. 定义全局UITextView(因手势回调中需访问)
    var myTextView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 2. 创建UITextView:大小250x200
        myTextView = UITextView(frame: CGRect(x: 0, y: 0, width: 250, height: 200))
        
        // 3. 视觉与文本配置
        myTextView.backgroundColor = .darkGray  // 深灰背景
        myTextView.textColor = .white           // 白色文本
        myTextView.font = UIFont(name: "Helvetica-Light", size: 20)  // 自定义字体
        myTextView.textAlignment = .left        // 左对齐
        myTextView.text = "Swift 起步走"        // 初始文本
        
        // 4. 编辑与键盘配置
        myTextView.isEditable = true    // 可编辑
        myTextView.isSelectable = true  // 可选择(支持复制)
        myTextView.keyboardType = .default  // 默认键盘
        
        // 5. 位置:屏幕中上部
        myTextView.center = CGPoint(x: fullScreenSize.width * 0.5, y: fullScreenSize.height * 0.3)
        self.view.addSubview(myTextView)
        
        // 6. 自定义菜单:添加「寄送」「FB」选项
        let mailItem = UIMenuItem(title: "寄送", action: #selector(sendMail))
        let fbItem = UIMenuItem(title: "FB", action: #selector(sendFB))
        UIMenuController.shared.menuItems = [mailItem, fbItem]  // 加入系统菜单
        
        // 7. 点击空白隐藏键盘:添加手势
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
        tapGesture.cancelsTouchesInView = false  // 不影响子视图(如TextView)的触摸事件
        self.view.addGestureRecognizer(tapGesture)
    }
    
    // 8. 手势回调:隐藏键盘
    @objc func hideKeyboard() {
        myTextView.resignFirstResponder()  // 结束TextView的编辑状态
    }
    
    // 9. 自定义菜单回调
    @objc func sendMail() { print("执行邮件发送逻辑") }
    @objc func sendFB() { print("执行FB分享逻辑") }
}

在这里插入图片描述

4.4 注意事项

  • 全局变量声明myTextView 需定义为类的属性(全局),若在 viewDidLoad 中定义为局部变量,手势回调无法访问;
  • 手势冲突问题tapGesture.cancelsTouchesInView = false 必须设置,否则点击 TextView 时会触发父视图手势,导致 TextView 无法获取焦点;
  • 文本滚动配置:可通过 contentInset 调整文本与视图边缘的间距,避免文本紧贴边框;
  • 占位提示实现:UITextView 无原生 placeholder,需通过 text 属性模拟(如初始文本设为灰色,编辑时清空并改颜色)。

五、 交互触发组件:UIButton

UIButton 是用于接收用户点击事件的核心交互组件(继承自 UIControl),支持系统预设样式(如「+」号、信息图标)与完全自定义样式(文字、背景色、图片),通过 target-action 机制绑定点击后的逻辑,是 App 中触发操作的主要入口(如提交、跳转、切换状态)。

5.1 核心功能

  • 提供可视化点击区域,支持多种预设样式与自定义外观;
  • 通过 target-action 绑定点击事件(无需代理,比 UITextField 更简洁);
  • 支持不同状态下的样式切换(如正常、高亮、禁用状态的文字颜色/背景色);
  • 可同时设置图标与文字,调整两者布局。

5.2 关键属性与方法

类别 属性/方法 作用说明
样式初始化 UIButton(type:) 初始化系统预设样式(如 .contactAdd 为「+」号按钮,.infoLight 为浅色信息图标)
文字配置 setTitle(_:for:) 设置指定状态的按钮文字(如 setTitle("按我", for: .normal).normal 为正常状态)
setTitleColor(_:for:) 设置指定状态的文字颜色(如 setTitleColor(.white, for: .normal)
外观配置 backgroundColor 设置按钮背景色(仅自定义样式有效,系统样式可能覆盖)
isEnabled 是否禁用按钮(false 时按钮变灰,无法触发点击)
事件绑定 addTarget(_:action:for:) 绑定点击事件(target 为事件处理对象,action 为回调方法,for 为触发事件类型,如 .touchUpInside 为手指在按钮内抬起)

5.3 代码逻辑解析

class ViewController: UIViewController {
    let fullScreenSize = UIScreen.main.bounds.size

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white  // 父视图背景色(避免按钮看不见)

        // 1. 系统预设样式按钮1:「+」号按钮
        var myButton = UIButton(type: .contactAdd)
        myButton.center = CGPoint(x: fullScreenSize.width * 0.4, y: fullScreenSize.height * 0.2)
        self.view.addSubview(myButton)  // 加入视图后,myButton变量将被覆盖

        // 2. 系统预设样式按钮2:浅色信息按钮(注意:此处覆盖了上方的myButton)
        myButton = UIButton(type: .infoLight)
        myButton.center = CGPoint(x: fullScreenSize.width * 0.6, y: fullScreenSize.height * 0.2)
        self.view.addSubview(myButton)

        // 3. 自定义样式按钮(再次覆盖myButton,最终仅此按钮绑定了点击事件)
        myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 30))
        myButton.setTitle("按我", for: .normal)          // 正常状态文字
        myButton.setTitleColor(.white, for: .normal)    // 正常状态文字颜色
        myButton.backgroundColor = .darkGray           // 背景色
        myButton.isEnabled = true                      // 启用按钮

        // 4. 绑定点击事件:点击后触发clickButton方法
        // target: self(当前ViewController),action: 方法选择器,for: .touchUpInside(手指在按钮内抬起)
        myButton.addTarget(self, action: #selector(clickButton), for: .touchUpInside)

        // 5. 位置:屏幕中央,加入视图
        myButton.center = CGPoint(x: fullScreenSize.width * 0.5, y: fullScreenSize.height * 0.5)
        self.view.addSubview(myButton)
    }

    // 6. 点击事件回调:切换父视图背景色
    @objc func clickButton() {
        if view.backgroundColor == .white {
            view.backgroundColor = .black
        } else {
            view.backgroundColor = .white
        }
    }
}

在这里插入图片描述

5.4 注意事项

  • 变量覆盖问题:代码中 myButton 被重复赋值,导致前两个系统样式按钮未绑定点击事件(仅第三个自定义按钮有效)。实际开发中建议为不同按钮定义独立变量(如 addButtoninfoButtoncustomButton);

  • 状态样式一致性:若需设置「高亮状态」(点击时)的样式,需用 setTitleColor(_:for: .highlighted)setBackgroundColor(_:for: .highlighted),避免点击时样式无变化;

  • 按钮点击区域:若按钮文字/图标过小,可通过 contentEdgeInsets 扩大点击区域(如 myButton.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)),提升用户体验。

资料推荐:https://github.com/0voice

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐