【iOS】OC语法知识小结

文章目录

前言

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

inWithCustomView:

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

自定义视图:可以传递任何你创建的 UIView 子类实例给这个方法。

按钮大小:UIBarButtonItem 的大小将根据传递的视图的大小自动调整。

自动布局:由于 UIBarButtonItem 会根据其内容调整大小,所以通常不需要手动设置按钮的约束。

使用场景:当需要在导航栏或工具栏中显示复杂的内容,或者需要更灵活地控制按钮的外观时,使用自定义视图是一个好选择。

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

objectivec 复制代码
// 创建一个自定义视图
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,以防止视图内容超出按钮边界。

视图弹出方法

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

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

参数一:modify,这是一个视图控制器的实例,将该视图作为模态视图弹出。

参数二:animated:YES,这个参数指定弹出视图控制器时是否需要动画效果。YES 表示弹出时会有一个动画效果,比如淡入或滑动。

参数三:completion:nil,这个参数是一个完成块,当视图控制器弹出完成后,可以在这里执行一些额外的操作。nil 表示您没有提供任何完成操作。

代码示例:

objectivec 复制代码
//提前创建好了一个视图控制器的实例modifyVC
UIViewController *modifyVC = [[UIViewController alloc] initWithNibName:@"ModifyViewController" bundle:nil];

// 在某个事件,比如按钮点击后,弹出 modifyVC
[self presentViewController:modifyVC animated:YES completion:nil];

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

修改UITextField的占位符文本颜色

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

代码示例:

objectivec 复制代码
// 创建一个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动画块来实现对视图的动画变换:

objectivec 复制代码
[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,或者设置一个透明的图像。

代码示例:

objectivec 复制代码
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 属性:

objectivec 复制代码
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 方法的使用

objectivec 复制代码
[self.tableView reloadData];

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

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

objectivec 复制代码
[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 的数据示例代码:

objectivec 复制代码
//我们有一个表视图和一个数据源数组,当数据源发生变化时,我们需要进行表视图的刷新

//dataArray是数据源数组
self.dataArray = newDataArray;

//刷新表视图
[self.tableView reloadData];

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

objectivec 复制代码
//有一个集合视图和一个数据源数组,当数据源发生变化时,我们需要对集合视图进行刷新:

//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,然后编写读书记。

相关推荐
Magnetic_h2 小时前
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)
笔记·学习·ios·objective-c
安和昂2 小时前
【iOS】MVP模式
ios
软件测试雪儿5 小时前
APP测试中ios和androis的区别,有哪些注意点
软件测试·macos·面试·职场和发展·cocoa
胖虎114 小时前
SwiftUI - (十九)组合视图
ios·swiftui·swift·组合视图
zhangfang6815 小时前
Go 语言切片(Slice)
开发语言·golang·xcode
davidson147119 小时前
Xcode
ios·swiftui·xcode·swift·apple
weixin_439738481 天前
IOS通过WDA自动化中遇到的问题
运维·ios·自动化
あjdc1 天前
iPhone所有机型的分辨率
开发语言·ios·objective-c·cocoa·iphone
davidson14711 天前
阿里云OSS下载-swift
阿里云·ios·云计算·iphone·swift