【iOS】OC语法知识小结

ops/2024/12/20 12:48:58/

文章目录

  • 前言
  • 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/ops/143493.html

相关文章

深入了解京东API接口:如何高效获取商品详情与SKU信息

在当今数字化时代,电商平台的数据接口成为了连接商家与消费者的桥梁。京东作为国内领先的电商平台,其API接口为开发者提供了丰富的商品信息获取途径。本文将深入探讨如何使用京东API接口高效获取商品详情与SKU信息,并附上简短而实用的代码示例…

电脑经常出现“msvcp110.dll文件丢失”的情况是什么原因“msvcp110.dll文件丢失”的解决方法

电脑经常出现“msvcp110.dll文件丢失”的情况,究竟是什么原因?以及,我们该如何解决? 在软件开发和日常使用电脑的过程中,不少朋友可能会遇到一些令人头疼的系统报错或文件丢失问题,比如“msvcp110.dll文件…

重生之我在异世界学编程之C语言:深入预处理篇(下)

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 条件编译(1&#…

中国工程科技2040发展战略研究

近日,中国工程院“中国工程科技未来20年发展战略研究”总体项目组发布《愿景驱动的中国工程科技2040发展战略研究》,基于我国工程科技发展需求和世界发展趋势,提出“经济预测-需求分析-技术预见-愿景分析-战略架构-技术路线图-政策选择”战略…

代码随想录第48天

739. 每日温度 class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:n len(temperatures)ans [0] * nst []for i in range(n - 1, -1, -1):t temperatures[i]while st and t > temperatures[st[-1]]:st.pop()if st:ans[i] st[-1] …

黑客术语(1)

在常见的黑客论坛中,经常会看到肉鸡、挂马和后门等词语,这些词语可以统称为黑客 术语,但是如果不理解这些词语,则在与其他黑客交流技术或经验时就会有障碍。所以 小白在入门黑客之前,掌握黑客的专业术语也是非常重要的! 1.肉鸡…

菜鸟每日刷牛客HJ8

菜鸟每日刷牛客 HJ8 合并表记录 描述 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,随后按照索引值的大小从小到大依次输出。 输入描述: 第一行输入一个整数n(1≦n≦500)代表数…

启动异常:Caused by: java.lang.IllegalStateException: Failed to introspect Class

背景 今天项目需要,导入一个本地的jar包,在pom文件,添加自定义依赖后,并通过mvn命令: mvn install:install-file -Dfilejar包的位置 -DgroupId自定义的groupId -DartifactId自定义的artifactId -Dversion自定义的ver…