BRPickerView icon indicating copy to clipboard operation
BRPickerView copied to clipboard

PickerView的弹出位置

Open honeybeeSwinging opened this issue 4 years ago • 11 comments

大佬,请问一下PickerView只能是从底部弹出,整个都显示在底部么,能不能设置高度并居中显示呢?谢谢大佬

honeybeeSwinging avatar Oct 19 '21 07:10 honeybeeSwinging

可以通过自定义弹窗视图来实现,使用下面方法把滚轮选择器添加上去即可

/// 扩展一:添加选择器到指定容器视图上
/// 应用场景:可将中间的滚轮选择器 pickerView 视图(不包含蒙层及标题栏)添加到任何自定义视图上(会自动填满容器视图),也方便自定义更多的弹框样式
/// @param view 容器视图
- (void)addPickerToView:(nullable UIView *)view NS_REQUIRES_SUPER;

agiapp avatar Oct 19 '21 08:10 agiapp

好的,谢谢大佬的回复,那再继续追问一下,那弹出和消失是需要自己处理了是吗?

honeybeeSwinging avatar Oct 20 '21 01:10 honeybeeSwinging

同时再问一下滚轮选择器添加到指定容器视图上是不需要设置frame么,会自动铺满指定容器?

honeybeeSwinging avatar Oct 20 '21 01:10 honeybeeSwinging

3、另外使用- (void)addPickerToView:(nullable UIView *)view NS_REQUIRES_SUPER;之后发现顶部的操作按钮不见了,比如“取消”、“确认”以及标题title设置也无效了,这是为什么?

honeybeeSwinging avatar Oct 20 '21 01:10 honeybeeSwinging

4、同时能不能给作者大佬提个小建议,就是弹出框的位置,能不能进行封装一下,用户可以自定义弹出的位置

honeybeeSwinging avatar Oct 20 '21 01:10 honeybeeSwinging

说明: 使用addPickerToView 方法只是添加中间的滚轮选择器到自己的自定义视图上,这样的目的是保证组件轻量级和通用性,可以兼容更多的自定义场景。对于一些不常见的定制化需求,都可以通过自定义弹框视图来实现。

答疑: 1、弹框视图、蒙层视图、取消按钮、确定按钮,都是自己去定义。 2、不需要再重新设置frame(设置了也不会生效),滚轮选择器会自适应父视图大小(即会铺满你指定的容器视图)。

agiapp avatar Oct 20 '21 02:10 agiapp

好的,谢谢大佬回复,刚才按你说的方法进行了开发,很棒。不过现在还有一个小问题就是怎么拿到默认选中的数据呢?

honeybeeSwinging avatar Oct 20 '21 03:10 honeybeeSwinging

就是使用addPickerToView直接打开pickerView不进行任何操作,直接点击自定义的“确定”,怎么拿到这个时候默认选中的数据呢?

honeybeeSwinging avatar Oct 20 '21 03:10 honeybeeSwinging

我的代码是这样的: BRAddressPickerView *addressPickerView = [[BRAddressPickerView alloc]init]; addressPickerView.pickerMode = BRAddressPickerModeArea; addressPickerView.title = @"请选择地区";

addressPickerView.dataSourceArr = AddressInModel.provincelist;

addressPickerView.isAutoSelect = YES;

addressPickerView.resultBlock = ^(BRProvinceModel * _Nullable province, BRCityModel * _Nullable city, BRAreaModel * _Nullable area) {

    weakself.provinceModel = province;
    
    weakself.cityModel = city;
    
    weakself.areaModel = area;
    
};

[addressPickerView addPickerToView:self.pickerBgView];

honeybeeSwinging avatar Oct 20 '21 03:10 honeybeeSwinging

resultBlock回调只有滚动滚轮时才会触发回调,可以使用下面这种方法,就是在你自定义的确定按钮点击事件方法里,执行一下doneBlock回调(会触发组件内部执行resultBlock回调)。

参考代码如下:

- (void)clickCustomDoneBtn {
    if (self.addressPickerView.doneBlock) {
        self.addressPickerView.doneBlock();
    }
}

agiapp avatar Oct 20 '21 06:10 agiapp

好的,谢谢大佬指点,棒棒哒,完美解决问题。

添加pikerView的代码:

BRAddressPickerView *addressPickerView = [[BRAddressPickerView alloc]init];
addressPickerView.pickerMode = BRAddressPickerModeArea;
addressPickerView.title = @"请选择地区";

addressPickerView.dataSourceArr = AddressInModel.provincelist;

addressPickerView.isAutoSelect = YES;

addressPickerView.resultBlock = ^(BRProvinceModel * _Nullable province, BRCityModel * _Nullable city, BRAreaModel * _Nullable area) {

    weakself.provinceModel = province;
    
    weakself.cityModel = city;
    
    weakself.areaModel = area;
    
};

self.addressPickerView = addressPickerView;


[addressPickerView addPickerToView:self.pickerBgView];

自定义“确定”按钮代码: -(void)clickCustomDoneBtn{

 //先执行doneBlock,然后里面会执行resultBlock
        if (self.addressPickerView.doneBlock) {
               self.addressPickerView.doneBlock();
           }

        if (_addressSelectBlock) {
            _addressSelectBlock(self.provinceModel,self.cityModel,self.areaModel);
        }

}

honeybeeSwinging avatar Oct 20 '21 07:10 honeybeeSwinging