iOS 11系統中,導航欄新加入了LargeTitles和searchController兩個新特性,UITableView新增了滑動操作(Swipe Actions)代理,本文主要介紹這兩方面。
特性一:導航欄
1、設置導航欄大標題
self.navigationController.navigationBar.prefersLargeTitles = YES;
2、設置導航欄搜索控制器
iOS 11中,NavigationItem
增加了新的屬性searchController
,只需實例一個UISearchController
,之后設置為navigationItem.searchController
即可。
具體實現如下:
_resultVC = [[ResultViewController alloc] init];
UISearchController *search = [[UISearchController alloc] initWithSearchResultsController:_resultVC];
search.searchResultsUpdater = self;
search.delegate = self;
search.hidesNavigationBarDuringPresentation = NO;
self.navigationItem.searchController = search;
此處將searchResultsController設置為其他的控制器,去實現自己的邏輯。
注:需要注意的是將當前控制器的definesPresentationContext
屬性設為true
,否則在切換searchResultsController時整個導航欄會消失,即:
self.definesPresentationContext = YES;
其中search.searchResultsUpdater = self;
代理方法- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
中,處理搜索邏輯。
其中search.hidesNavigationBarDuringPresentation = NO;
搜索時是否隱藏導航欄。
簡單Demo
特性二:滑動操作(Swipe Actions)
1、iOS 8中UITableVIew的右滑操作接口
在iOS 8之后,蘋果官方增加了UITableVIew的右滑操作接口,即新增了一個代理方法tableView: editActionsForRowAtIndexPath:
和一個類UITableViewRowAction
,代理方法返回的是一個數組,我們可以在這個代理方法中定義所需要的操作按鈕(刪除、置頂等),這些按鈕的類就是UITableViewRowAction
。只能定義按鈕的顯示文字、背景色、按鈕事件。
2、iOS 11中UITableVIew新增代理方法,支持按鈕設置圖片,支持左滑、右滑操作
首先相對iOS 8的方法,支持設置按鈕圖片啦。
代理方法的替換如下:
// Swipe actions
// These methods supersede -editActionsForRowAtIndexPath: if implemented
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath;
這兩個代理方法返回的是UISwipeActionsConfiguration
類型的對象,創建該對象及賦值 代碼片段如下:
- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath {
//刪除按鈕(系統類型)
UIContextualAction *deleteRowAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"delete" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) {
[self.titleArr removeObjectAtIndex:indexPath.row];
completionHandler(YES);
}];
//設置圖片
deleteRowAction.image = [UIImage imageNamed:@"icon_del"];
//UISwipeActionsConfiguration類
UISwipeActionsConfiguration *config = [UISwipeActionsConfiguration configurationWithActions:
@[deleteRowAction]];
return config;
}
創建UIContextualAction
對象時,UIContextualActionStyle
有兩種類型:
typedef NS_ENUM(NSInteger, UIContextualActionStyle) {
UIContextualActionStyleNormal,
UIContextualActionStyleDestructive
} NS_SWIFT_NAME(UIContextualAction.Style)
如果是置頂、已讀等按鈕就使用UIContextualActionStyleNormal
類型。delete按鈕可使用UIContextualActionStyleDestructive
類型,當使用該類型時,如果是右滑操作,一直向右滑動某個cell,會直接執行刪除操作??。
總結:
介紹了iOS 11中一些新特性,未完待續... ...