[Android开发学iOS系列] 快速上手UIKit

快速上手iOS UIKit

UIKit是苹果官方的framework, 其中包含了各种UI组件, window和view, 事件处理, 交互, 动画, 资源管理等基础设施支持.

按照前面的介绍, 用UIKit写UI可以用storyboard(Interface Builder)和代码两种方式.

大体的思路都是添加组件后, 设置属性, 设置尺寸位置约束, 处理响应事件.

这里主要介绍用代码写的情形.
希望这篇文章, 可以帮你快速上手UIKit, 熟悉常用的组件, 完成一些简单的UI界面相关任务.

在代码中写UI的基本步骤

在代码中写UI的步骤大致是:

  • 初始化.
  • addSubview添加到当前view, 或hierarchy中的其他可达view.
  • 设置约束.

比如:

class ViewController: UIViewController {
    var myLabel: UILabel!

    override func loadView() {
        view = UIView()
        view.backgroundColor = .white

		// 创建实例
        myLabel = UILabel()
        myLabel.translatesAutoresizingMaskIntoConstraints = false
        myLabel.text = "Hello"
        
        // 添加到view中
        view.addSubview(myLabel)

        // 设置约束
        NSLayoutConstraint.activate([
            myLabel.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor),
            myLabel.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor),
        ])
    }
}

这里有几点说明:

  • var** myLabel: UILabel! 组件字段这样声明有lateinit的作用, 如果不带!会报错, 说controller没有init方法.
  • 如果在代码中设置UI组件的constraints, 那么这个属性经常要设置为false: translatesAutoresizingMaskIntoConstraints = **false**. 如果组件的位置是通过frame来设置的, 则不用设置这个属性.
  • 约束有多种写法, 这里只是其中一种, 用anchor的方式.

常用组件

文字: UILabel

设置文字等属性:

myLabel = UILabel()
myLabel.translatesAutoresizingMaskIntoConstraints = false
myLabel.font = UIFont.systemFont(ofSize: 24)
myLabel.text = "Hello"
myLabel.numberOfLines = 0
myLabel.textAlignment = .right

给UILabel设置点击事件:

myLabel.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
myLabel.addGestureRecognizer(tapGesture)

点击事件处理方法:

@objc func userDidTapLabel(tapGestureRecognizer _: UITapGestureRecognizer) {
    print("label clicked!")
}

这里有#selector, 对应的userDidTapLabel方法要加上@objc. 便于OC的代码调用能找到swift的方法.

给UILabel设置点击事件和UIButton不同, 这点我们后面说继承关系的时候解释一下.

按钮: UIButton

设置文字:

submitButton = UIButton(type: .system)
submitButton.translatesAutoresizingMaskIntoConstraints = false
submitButton.titleLabel?.font = UIFont.systemFont(ofSize: 36)
submitButton.setTitle("SUBMIT", for: .normal)
submitButton.setTitleColor(.black, for: .normal)

设置点击事件:

submitButton.addTarget(self, action: #selector(submitTapped), for: .touchUpInside)

@objc func submitTapped(_ sender: UIButton) {

}

这里使用@objc的理由同上.

基本上我们在iOS代码中用到#的时候, 对应的方法都要加上@objc.

输入框: UITextField

myTextField = UITextField()
myTextField.translatesAutoresizingMaskIntoConstraints = false
myTextField.placeholder = "What's your name?"
myTextField.textAlignment = .center
myTextField.font = UIFont.systemFont(ofSize: 44)

想要禁用输入框可以这样:

myTextField.isUserInteractionEnabled = false

弹框

在app里简单的交互我们经常需要弹出一个对话框:

let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default))
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
present(alert, animated: true)

其中preferredStyle有.alert.actionSheet两种.

.alert是中心的对话框, 一般用于信息提示或者确认操作; .actionSheet是底部的bottom sheet, 一般用来在几个选项中做选择.

其他

  • view中比较常用的属性isHidden, 控制view是否需要隐藏.
  • 所有的UIView都有一个layer属性.
    设置border的宽度和颜色就在layer上设置.
    CALayer在UIView之下. 所以不知道UIColor, 只知道CGColor.

本文仅列出几个常用组件, 更多的请看官方示例.

这里可以下载

继承关系

NSObject是所有Cocoa Touch class的基类. 所有UIKit中的类都是它的子类.

这里有一个类关系的图:

UIKit Classes

我们这里不展开讲述所有了, 只解答一下前面提出的关于UILabel点击事件的问题.

UIKit Classes annotated

这里可以看到UILabelUIButton虽然都继承了UIView, 但是UIButton的继承层次更深一些, 它还继承了了UIControl.

可以看到和UIButton平级的还有好几个子类.

Controls使用的是target-action机制, 所有的action都通过方法: addTarget(_:action:for:) 添加.

约束Constraints

当在代码中设置约束时, 有三种选择:

  • 使用layout anchors.
  • 使用NSLayoutConstraint类.
  • 使用Visual Format Language.

上面我们提到过的就是其中Layout Anchors的写法:

初级单个写法:

buttonsView.topAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
buttonsView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
buttonsView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
buttonsView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

放进数组里批量激活写法:

NSLayoutConstraint.activate([
            buttonsView.topAnchor.constraint(equalTo: view.centerYAnchor),
            buttonsView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            buttonsView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            buttonsView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        ])

感觉是对新手比较直观的一种写法.

其他写法文末有参考文档.

PS: 项目中更流行用 SnapKit.

区域限制

  • safeAreaLayoutGuide : 去掉圆角和刘海.
  • layoutMarginsGuide : safe area的内部再加上一些额外的margin.

Bonus

  • 友情提示: 在xcode里就可以看官方文档, 快捷键是Cmd + Shift + 0.

References

原文链接:https://www.cnblogs.com/mengdd/p/iOS-UIKit-quick-start.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:[Android开发学iOS系列] 快速上手UIKit - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 公有云、私有云、混合云都是什么?有没有通俗一点的答案?企业选哪一种云比较好?

        很多同学都觉得公有云、私有云、混合云这些概念的认识比较混乱,开始我面对网上很多专业的解释不明所以,直到我遇到这个说法:   大白话解释一下 你娶了一个老婆,这叫传统IT架构。 你觉得一个老婆不够,这叫传统企业CIO的困境。 你又娶了一个老婆,这叫双活数据中心。 你在外地又娶了一个小老婆,这叫两地三中心容灾。 你娶了很多风格气质各异的小老婆,以至于形成…

    IOS 2023年4月17日
    00
  • iOS上架流程

    1 准备 2 申请App ID 2.1 打开[苹果开发者官网](https://developer.apple.com),点击Account登陆账号。 2.2 进入ID申请 3 创建证书请求文件(*.cerSigningRequest文件) 4 添加软件开发证书和分发证书 并下载(*.CER文件) 5 创建Profile配置文件 6 新建开发者应用 7 打包…

    IOS 2023年4月17日
    00
  • 【iOS逆向与安全】frida-trace入门

    前言 frida-trace是一个用于动态跟踪函数调用的工具。支持android和ios。安装教程请参考官网。工欲善其事必先利其器。本文将以某App为示范,演示frida-trace的各种方法在iOS中的应用。 一、目标 让看文章的你在使用frida-trace时更得心应手。 二、工具 mac系统 frida:动态调试工具 已越狱iOS设备:脱壳及frida…

    IOS 2023年4月17日
    00
  • 使用SDLocalize高效完成iOS本地化国际化工作

    使用SDLocalize高效完成iOS本地化国际化工作 SDLocalize 该方案最大特点是对旧代码几乎没有较多修改就可以完成从单语言项目修改为多语言的项目。并支持XIB的控件本地化,无需创建不同语言版本的XIB文件。 SDLocalize的工作原理: 首先标记一组需要本地化的控件 然后在恰当时机(viewDidLoad),触发一组本地化任务(Then (…

    IOS 2023年4月17日
    00
  • iOS上拉边界下拉白色空白问题解决概述

    表现 手指按住屏幕下拉,屏幕顶部会多出一块白色区域。手指按住屏幕上拉,底部多出一块白色区域。 产生原因 在 iOS 中,手指按住屏幕上下拖动,会触发 touchmove 事件。这个事件触发的对象是整个 webview 容器,容器自然会被拖动,剩下的部分会成空白。 解决方案 1. 监听事件禁止滑动 移动端触摸事件有三个,分别定义为 touchstart :手指…

    IOS 2023年4月17日
    00
  • [Android开发学iOS系列] Auto Layout

    [Android开发学iOS系列] Auto Layout 内容: 介绍什么是Auto Layout. 基本使用方法 在代码中写约束的方法 Auto Layout的原理 尺寸和优先级 Auto Layout的使用细则 重要的属性 StackView Layout Guide Performance Debugging What is Auto Layout …

    IOS 2023年4月17日
    00
  • [Android开发学iOS系列] TableView展现一个list

    TableView 基础 本文讲讲TableView的基本使用.顺便介绍一下delegation. TableView用来做什么 TableView用来展示一个很长的list.和Android中的RecyclerView不同, iOS中的TableView只能是竖直方向的list. 如何写一个最简单的TableView 一个最简单的TableViewCont…

    IOS 2023年4月17日
    00
  • graphhopper-ios 编译过程详解

    一、写在前面 GraphHopper 是一个快速且高效的路径规划引擎,它默认使用OpenStreetMap和GTFS数据, 也可以导入其他数据源。它可以用作java库或独立的web服务器,去计算两个或多个点之间的线路的距离,时间,转弯指令和许多道路属性。除了“A-to-B”的路径规划能力之外,它还支持“snap to road”、等时线计算、移动导航等。 g…

    IOS 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部