You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ActionSheetStringPicker与UIBarButtonItem结合时头部显示异常,如何解决?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:35:28