文章目录
- 前言
- 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 时,视图控件会执行以下操作:
- 重新请求数据:视图控件会重新请求数据源的方法,以获取最新的数据数量。比如 tableView:numberOfRowsInSection: 和 collectionView:numberOfItemsInSection:。
- 重新加载单元格:所有可见的单元格(或项)会被重新创建,并重新配置显示。对于 UITableView,这是通过 tableView:cellForRowAtIndexPath: 方法完成的;对于 UICollectionView,则通过 collectionView:cellForItemAtIndexPath: 方法完成的。
- 重新布局:视图控件会重新计算和布局所有单元格的位置,以适应当前的数据内容。
高效使用 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,然后编写读书记。