【iOS】OC语法知识小结

server/2024/12/19 19:15:42/

文章目录

  • 前言
  • inWithCustomView:
  • 视图弹出方法
  • 修改UITextField的占位符文本颜色
  • 视图变换的动态效果
  • 导航栏的阴影效果
    • 导航栏阴影效果
    • 管理和自定义阴影效果
  • reloadData
    • reloadData 方法的使用
    • reloadData 的工作原理
    • 高效使用 reloadData
  • 键盘的不同属性类型
  • 总结

前言

  在之前写项目和代码的时候,遇到许多布局的实现问题,学习后并没有写成笔记,而是放在备忘录里,这篇博客是对暑假到大二上学期以来有些遗漏的OC语法问题的归纳。

inWithCustomView:

initWithCustomView: 是用于初始化 UIBarButtonItem 的方法。我们可以使用这个方法将一个自定义的视图(比如 UILabel、UIImageView 或任何继承自 UIView 的自定义视图)作为按钮的显示内容。

自定义视图:可以传递任何你创建的 UIView 子类实例给这个方法。
按钮大小:UIBarButtonItem 的大小将根据传递的视图的大小自动调整。
自动布局:由于 UIBarButtonItem 会根据其内容调整大小,所以通常不需要手动设置按钮的约束。
使用场景:当需要在导航栏或工具栏中显示复杂的内容,或者需要更灵活地控制按钮的外观时,使用自定义视图是一个好选择。

创建一个带有自定义视图的 UIBarButtonItem 的代码示例:

// 创建一个自定义视图
UILabel *customLabel = [[UILabel alloc] init];
[customLabel setText:@"Custom"];
[customLabel setTextColor:[UIColor whiteColor]];
customLabel.backgroundColor = [UIColor clearColor];
customLabel.font = [UIFont systemFontOfSize:18];// 初始化UIBarButtonItem并使用自定义视图
UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:customLabel];// 将自定义的UIBarButtonItem添加到导航项中
self.navigationItem.rightBarButtonItem = customBarItem;

注意:在使用自定义视图时,将视图的 clipsToBounds 属性设置为 YES,以防止视图内容超出按钮边界。

视图弹出方法

用于弹出一个新的视图控制器的语法:

//表示正在调用当前视图控制器(self)的 presentViewController: 方法。
[self presentViewController:modify animated:YES completion:nil]; 

参数一:modify,这是一个视图控制器的实例,将该视图作为模态视图弹出。
参数二:animated:YES,这个参数指定弹出视图控制器时是否需要动画效果。YES 表示弹出时会有一个动画效果,比如淡入或滑动。
参数三:completion:nil,这个参数是一个完成块,当视图控制器弹出完成后,可以在这里执行一些额外的操作。nil 表示您没有提供任何完成操作。
代码示例:

//提前创建好了一个视图控制器的实例modifyVC
UIViewController *modifyVC = [[UIViewController alloc] initWithNibName:@"ModifyViewController" bundle:nil];// 在某个事件,比如按钮点击后,弹出 modifyVC
[self presentViewController:modifyVC animated:YES completion:nil];

这样,当某个事件触发时(例如用户点击了一个按钮),modifyVC 将被弹出,并且弹出过程中会有动画效果。如果需要在视图控制器弹出完成后执行一些操作,可以将 completion 参数设置为一个实际的代码块。

修改UITextField的占位符文本颜色

UITextField的占位符文本颜色是可以修改的,我们可以使用UITextField的attributedPlaceholder属性来设置具有特定样式的占位符文本,包括颜色、字体等。
代码示例:

// 创建一个NSMutableAttributedString,用于设置富文本样式
NSMutableAttributedString *placeholderString = [[NSMutableAttributedString alloc] initWithString:@"请输入成绩" attributes:@{}];// 设置占位符文本的颜色
[placeholderString addAttribute:NSForegroundColorAttributeName value:[UIColor grayColor] range:NSMakeRange(0, [placeholderString string].length)];// 将富文本占位符设置给文本字段
_examText.attributedPlaceholder = placeholderString;

在这段代码中,我们首先创建了一个NSMutableAttributedString实例,并初始化为占位符文本字符串。然后,我们使用addAttribute:方法添加了一个前景色属性(NSForegroundColorAttributeName),将其值设置为我们想要的颜色,笔者这里用的是灰色。最后,我们将这个富文本字符串赋给_examText的attributedPlaceholder属性。这样,我们就自定义了占位符文本的样式。

注意:使用attributedPlaceholder后,所有的占位符文本样式都将应用设置的样式属性。如果只想修改颜色而保留其他默认样式,可以先获取默认的占位符文本,然后只修改颜色属性。

视图变换的动态效果

我们可以使用UIView动画块来实现对视图的动画变换:

[UIView animateWithDuration:0.2 animations:^{//self.view.transform: 这个属性设置了视图的变换效果。transform 属性影响视图的位置、大小和旋转//CGAffineTransformMakeTranslation(0, -y+160): 这个函数创建了一个平移变换,视图在水平方向上平移0个点,在垂直方向上平移-y+160个点。也就是说,视图将向上移动y-160个点。self.view.transform = CGAffineTransformMakeTranslation(0, -y + 160);
}];

[UIView animateWithDuration:0.2 animations:^{}];方法:
参数一:0.2,创建了一个动画块,动画持续时间为 0.2 秒,这个参数可以用来调整动画变换的快慢。
参数二:^{},在这个块内,我们可以指定希望动画执行的变化。

如果需要在动画后重置视图的变换,可以将 self.view.transform 设置回 CGAffineTransformIdentity,或者应用新的变换。

导航栏的阴影效果

UINavigationBarAppearance 的 shadowImage 和 shadowColor 属性用来控制导航栏的阴影效果。默认情况下,导航栏有阴影效果以提升视觉层次感,我们也可以根据需要进行自定义。

导航栏阴影效果

阴影图像 (shadowImage)
默认阴影图像:UINavigationBar 的默认样式通常包括一个阴影图像,这个图像创建了一个底部边缘的阴影效果,使导航栏从下方看起来有一个轻微的阴影。
自定义阴影图像:我们可以设置 shadowImage 属性为一个自定义的 UIImage 对象,以改变或移除阴影效果。如果将 shadowImage 设置为一个自定义的图像,它会替换掉默认的阴影效果。
阴影颜色 (shadowColor)
默认阴影颜色:导航栏的阴影颜色是系统默认的颜色。
自定义阴影颜色:我们可以通过 shadowColor 属性设置一个自定义的阴影颜色,或者将其设置为 nil 以移除阴影颜色,使导航栏没有阴影效果。

管理和自定义阴影效果

移除阴影
移除导航栏的阴影效果,可以将 shadowImage 设置为 nil,或者设置一个透明的图像。
代码示例:

UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
appearance.backgroundColor = [UIColor systemBackgroundColor]; // 设置背景颜色
appearance.shadowImage = nil;  // 移除阴影图像
appearance.shadowColor = nil; // 移除阴影颜色(可选)if (self.navigationController) {self.navigationController.navigationBar.standardAppearance = appearance;self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
}

设置自定义阴影图像
自定义阴影效果,可以创建一个带有阴影的 UIImage,然后设置 shadowImage 属性:

UIImage *customShadowImage = [UIImage imageNamed:@"customShadowImage"]; // 使用自定义的阴影图像
appearance.shadowImage = customShadowImage;if (self.navigationController) {self.navigationController.navigationBar.standardAppearance = appearance;self.navigationController.navigationBar.scrollEdgeAppearance = appearance;
}

注:shadowColor 属性在 UINavigationBarAppearance 中不直接存在,shadowImage 和 backgroundImage 属性间接控制了阴影的显示。

reloadData

reloadData 主要用于刷新视图控件中的数据内容。这个方法通常用于表视图(UITableView)或集合视图(UICollectionView),它会重新加载视图控件中的所有数据项,并刷新界面的显示。

reloadData 方法的使用

[self.tableView reloadData];

在 UITableView 中,reloadData 会重新加载表视图中的所有数据,刷新所有的单元格(UITableViewCell)。这在数据源发生变化后非常有用,例如数据从网络加载完成后,或者数据被修改时。

注:在调用 reloadData 时,表视图会重新调用数据源方法来更新所有单元格,因此要确保数据源的数据是最新的。

[self.collectionView reloadData];

在 UICollectionView 中,reloadData 会重新加载集合视图中的所有项(UICollectionViewCell)。适用于集合视图的数据源发生变化时,刷新整个集合视图的显示。

注:与 UITableView 类似,reloadData 会导致集合视图重新调用数据源方法,并重新布局所有单元格。这可能会影响性能,尤其是当集合视图中包含大量数据项时。

reloadData 的工作原理

当你调用 reloadData 时,视图控件会执行以下操作:

  1. 重新请求数据:视图控件会重新请求数据源的方法,以获取最新的数据数量。比如 tableView:numberOfRowsInSection: 和 collectionView:numberOfItemsInSection:。
  2. 重新加载单元格:所有可见的单元格(或项)会被重新创建,并重新配置显示。对于 UITableView,这是通过 tableView:cellForRowAtIndexPath: 方法完成的;对于 UICollectionView,则通过 collectionView:cellForItemAtIndexPath: 方法完成的。
  3. 重新布局:视图控件会重新计算和布局所有单元格的位置,以适应当前的数据内容。

高效使用 reloadData

尽量减少调用频率:如果只需要更新部分数据,可以考虑使用更细粒度的方法来刷新数据,例如 reloadRowsAtIndexPaths:withRowAnimation: 或 reloadSections:withRowAnimation:(UITableView)以及 reloadItemsAtIndexPaths:(UICollectionView),而不是调用 reloadData。

避免在主线程阻塞:尽量避免在主线程上进行长时间的操作,这样可以避免界面卡顿。可以使用异步操作来更新数据,然后在主线程上调用 reloadData。

优化数据源:在数据源更新后,确保数据源的状态是最新的,以避免数据不一致的情况。
更新 UITableView 的数据示例代码:

//我们有一个表视图和一个数据源数组,当数据源发生变化时,我们需要进行表视图的刷新//dataArray是数据源数组
self.dataArray = newDataArray;//刷新表视图
[self.tableView reloadData];

更新UICollectionView的数据与上面同理:

//有一个集合视图和一个数据源数组,当数据源发生变化时,我们需要对集合视图进行刷新://itemsArray是数据源数组
self.itemsArray = newItemsArray;// 刷新集合视图
[self.collectionView reloadData];

键盘的不同属性类型

UIKeyboardTypeDefault:默认键盘类型,适用于一般文本输入。
UIKeyboardTypeASCIICapable:ASCII 字符键盘,适用于只需要 ASCII 字符的输入。
UIKeyboardTypeNumbersAndPunctuation:数字和标点符号键盘,适用于需要输入数字和标点符号的场景。
UIKeyboardTypeURL:专门用于输入 URL 的键盘,通常包括用于输入斜杠的特殊键。
UIKeyboardTypeNumberPad:仅包含数字的键盘,适用于仅需要输入数字的场景,如电话号码或计算器输入。
UIKeyboardTypePhonePad:专为电话号码输入设计的键盘,包含常用的电话号码符号。
UIKeyboardTypeEmailAddress:适用于电子邮件地址输入的键盘,包含电子邮件地址输入所需的特殊字符。
UIKeyboardTypeDecimalPad:数字键盘,包含一个小数点,用于输入需要小数点的数字。
UIKeyboardTypeWebSearch:用于 Web 搜索的键盘,包含搜索相关的字符和布局。

总结

  以上就是对之前遗漏的学习笔记的补充,虽然有些问题在现在看来很简单,但是确实是当时在实现布局和功能时遇到的问题,后续应该会接着阅读Effective Objective-C 2.0,然后编写读书记。


http://www.ppmy.cn/server/151517.html

相关文章

如何将多张图片合并为一个pdf?多张图片合并成一个PDF文件的方法

如何将多张图片合并为一个pdf?当我们需要将多张图片合并为一个PDF文件时,通常是因为我们希望将这些图片整理成一个统一的文档,方便查看、分享或打印。无论是工作中需要提交的报告、学生们需要整理的作业,还是个人收藏的照片、旅行…

解决几个常见的ASP.NET Core Web API 中多线程并发写入数据库失败的问题

前言 在ASP.NET Core Web API应用程序中,当多个并发线程同时调用新增用户数据的接口时,可能会遇到数据库写入失败的问题。这个问题通常源于多个线程同时访问数据库时,可能会导致以下情况: 数据库连接池耗尽:每个线程…

使用 MyBatis-Plus Wrapper 构建自定义 SQL 查询

前言 MyBatis-Plus (MP) 是一款基于 MyBatis 的增强工具,它简化了数据库操作,提供了诸如自动分页、条件构造器等功能,极大地提高了开发效率。其中,Wrapper 条件构造器是 MP 的核心功能之一,它允许开发者以链式调用的方…

编写composer包和发布全攻略

laravel composer 扩展包开发(超详细) 快速发布一个composer扩展包 我之所以想先带大家快速了解一个composer包的发布过程,是因为我打算把二次封装的组件作为composer包发布。我必须了解composer组件怎么发布,有哪些功能。 创…

使用 Wireshark 和 Lua 脚本解析通讯报文

在复杂的网络环境中,Wireshark 凭借其强大的捕获和显示功能,成为协议分析不可或缺的工具。然而,面对众多未被内置支持的协议或需要扩展解析的场景,Lua 脚本的引入为Wireshark 提供了极大的灵活性和可扩展性。本文将详细介绍如何使…

Flink是什么?Flink技术介绍

官方参考资料:Apache Flink — Stateful Computations over Data Streams | Apache Flink Flink是一个分布式流处理和批处理计算框架,具有高性能、容错性和灵活性。以下是关于Flink技术的详细介绍: 一、Flink概述 ‌定义‌:Fli…

使用阿里云Certbot-DNS-Aliyun插件自动获取并更新免费SSL泛域名(通配符)证书

进入nginx docker,一般是Alpine Linux系统 1. 依次执行命令: sudo docker-compose exec nginx bashapk updateapk add certbot apk add --no-cache python3 python3-dev build-baseapk add python3 py3-pippip3 install --upgrade pippip3 install certbot-dns-ali…

文件断点续传(视频播放,大文件下载)

客户端每次请求取大文件部分数据。 浏览器播放mp4视频时,会首先传Range消息头,检测到206状态码,和Content-Range,Accept-Ranges 会自动请求余下数据。后端需要在文件任意偏移量取数据。 参考: springboot项目实现断…