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

相关推荐
fzxwl2 小时前
隆重推荐(Android 和 iOS)UI 自动化工具—Maestro
android·ui·ios
运维-大白同学14 小时前
go-中间件的使用
中间件·golang·xcode
若水无华2 天前
fiddler 配置ios手机代理调试
ios·智能手机·fiddler
Aress"2 天前
【ios越狱包安装失败?uniapp导出ipa文件如何安装到苹果手机】苹果IOS直接安装IPA文件
ios·uni-app·ipa安装
Jouzzy2 天前
【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error
安全·ios·iphone
瓜子三百克2 天前
采用sherpa-onnx 实现 ios语音唤起的调研
macos·ios·cocoa
左钦杨2 天前
IOS CSS3 right transformX 动画卡顿 回弹
前端·ios·css3
努力成为包租婆2 天前
SDK does not contain ‘libarclite‘ at the path
ios
安和昂3 天前
【iOS】Tagged Pointer
macos·ios·cocoa
I烟雨云渊T4 天前
iOS 阅后即焚功能的实现
macos·ios·cocoa