ActionSheetStringPicker与UIBarButtonItem结合时头部显示异常,如何解决?
当使用ActionSheetStringPicker并将UIBarButtonItem作为origin参数传入时,会出现头部标题栏布局异常的问题(表现为标题区域排版错乱、控件位置偏移)。相关调用代码如下:
func openFilter(sender: UIBarButtonItem) { let arr:NSArray = sortingArray as NSArray ActionSheetStringPicker.show(withTitle: "Filter Data", rows: arr as [AnyObject], initialSelection: filterPosition, doneBlock: { picker, value, index in self.filterPosition = value self.selectedPos = -1 self.filterData() self.tableViewMain.setContentOffset(.zero, animated:true) }, cancel: { ActionStringCancelBlock in return }, origin: sender) }
以下是几种可行的解决方案:
改用UIBarButtonItem对应的视图作为origin
直接传入UIBarButtonItem会导致picker的定位计算出错,通过value(forKey: "view")获取按钮对应的原生视图作为origin,能让picker正确计算弹出位置,修复头部布局问题。修改后的代码:func openFilter(sender: UIBarButtonItem) { let arr:NSArray = sortingArray as NSArray // 获取UIBarButtonItem对应的视图 let originView = sender.value(forKey: "view") as? UIView ?? sender ActionSheetStringPicker.show(withTitle: "Filter Data", rows: arr as [AnyObject], initialSelection: filterPosition, doneBlock: { picker, value, index in self.filterPosition = value self.selectedPos = -1 self.filterData() self.tableViewMain.setContentOffset(.zero, animated:true) }, cancel: { ActionStringCancelBlock in return }, origin: originView) }自定义头部视图
如果第一种方法无效,可以直接自定义picker的头部视图,完全控制布局逻辑,避免依赖库的默认头部计算:func openFilter(sender: UIBarButtonItem) { let arr:NSArray = sortingArray as NSArray let picker = ActionSheetStringPicker(title: "Filter Data", rows: arr as [AnyObject], initialSelection: filterPosition, doneBlock: { picker, value, index in self.filterPosition = value self.selectedPos = -1 self.filterData() self.tableViewMain.setContentOffset(.zero, animated:true) }, cancel: { _ in return }, origin: sender) // 构建自定义头部 let customHeader = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 44)) customHeader.backgroundColor = .systemBackground let titleLabel = UILabel(frame: customHeader.bounds) titleLabel.text = "Filter Data" titleLabel.textAlignment = .center titleLabel.font = UIFont.systemFont(ofSize: 16, weight: .medium) customHeader.addSubview(titleLabel) // 替换picker头部 picker?.setCustomHeader(customHeader) picker?.show() }更新库版本
旧版本的ActionSheetStringPicker可能存在针对UIBarButtonItem的布局bug,尝试将库更新到最新版本,大概率能直接解决该问题。
内容的提问来源于stack exchange,提问作者Sagar Zala
相关产品推荐
相关产品推荐

