尝试使用 BEMCheckBoxes 创建单选按钮组

Posted

技术标签:

【中文标题】尝试使用 BEMCheckBoxes 创建单选按钮组【英文标题】:Trying to make a radio button group with BEMCheckBoxes 【发布时间】:2020-04-13 16:16:45 【问题描述】:

我想创建一个单选按钮组,当已经使用BEMCheckBoxes 没有检查任何内容时,它将是这样的:

在我看来,我不能简单地在按钮中添加数字。

所以我决定制作一个带有标签和居中复选框的视图。

这是我目前的代码:

// Add An horizontal stackView with check group
UIStackView uIStackView = new UIStackView();
uIStackView.TranslatesAutoresizingMaskIntoConstraints = false;
uIStackView.Axis = UILayoutConstraintAxis.Horizontal;
uIStackView.Alignment = UIStackViewAlignment.Center;
qolEvaluationCard.AddSubview(uIStackView);
uIStackView.Anchor(top: criteria.BottomAnchor, leading: criteria.LeadingAnchor, trailing: criteria.TrailingAnchor, size: new CGSize(0, 32));
BEMCheckBoxGroup bEMCheckBoxGroup = new BEMCheckBoxGroup();
bEMCheckBoxGroups.Add(bEMCheckBoxGroup);
for (int score= 1; score <= 10; score++)

   var container = new UIView(new CGRect(0, 0, 32, 32));
   var label = new UILabel();
   label.Text = $@"score";
   label.TintColor = UIColor.Black;
   container.AddSubview(label);
   var checkbox = new BEMCheckBox(new CGRect(0, 0, 32, 32));
   container.AddSubview(checkbox);
   checkbox.BoxType = BEMBoxType.Circle;
   checkbox.OnAnimationType = BEMAnimationType.Stroke;
   checkbox.Center = label.Center = new CGPoint(container.Frame.Size.Width / 2, container.Frame.Size.Height / 2);
   // Transparent BackgroundColor
   checkbox.BackgroundColor = null;
   checkbox.TintColor = UIColor.Gray;
   checkbox.OnTintColor = optimistic_orange;
   bEMCheckBoxGroup.AddCheckBoxToGroup(checkbox);
   uIStackView.AddArrangedSubview(container);

结果不是我所期望的,但我不知道哪里出了问题:

为什么我的复选框不透明以显示标签? 显然UIStackView内部也存在分布问题。

任何帮助表示赞赏。

Anchor 扩展方法是:

internal static void Anchor(this UIView uIView, NSLayoutYAxisAnchor top = null, NSLayoutXAxisAnchor leading = null, NSLayoutYAxisAnchor bottom = null, NSLayoutXAxisAnchor trailing = null, UIEdgeInsets padding = default, CGSize size = default)

    uIView.TranslatesAutoresizingMaskIntoConstraints = false;
    if (top != null)
    
        uIView.TopAnchor.ConstraintEqualTo(top, padding.Top).Active = true;
    

    if (leading != null)
    
        uIView.LeadingAnchor.ConstraintEqualTo(leading, padding.Left).Active = true;
    

    if (bottom != null)
    
        uIView.BottomAnchor.ConstraintEqualTo(bottom, -padding.Bottom).Active = true;
    

    if (trailing != null)
    
        uIView.TrailingAnchor.ConstraintEqualTo(trailing, -padding.Right).Active = true;
    

    if (size.Width != 0)
    
        uIView.WidthAnchor.ConstraintEqualTo(size.Width).Active = true;
    

    if (size.Height != 0)
    
        uIView.HeightAnchor.ConstraintEqualTo(size.Height).Active = true;
    

编辑 1:刚刚在 Reveal 工具的帮助下发现我的标签大小不明确。

var label = new UILabel();

变成

var label = new UILabel(new CGRect(0, 0, 32, 32));

这解决了“隐形标签”问题。

【问题讨论】:

您好,使用UICollectionView 来实现如何,您可以自定义项目模板以显示您的需求。 docs.microsoft.com/en-us/xamarin/ios/user-interface/controls/… 【参考方案1】:

我的答案是 Swift 代码,但是给你作品的概念。 我建议您将问题分解为简单的步骤。 只需尝试在 UIStackView 上正确布局复选框 (BEMCheckBox),然后创建包含 UILabel + BEMCheckBox 的自定义视图,现在将它们添加到 UIStackView 并查看布局。

为什么标签没有出现在复选框上?

因为您先添加标签,然后将复选框放在上面。

container.addSubview(checkbox)
container.addSubview(label)

设置 StackView:

实现复选框水平布局

let stackView: UIStackView = 
    let stack = UIStackView(arrangedSubviews: customCheckboxes)
    stack.spacing = 8
    stack.distribution = .fillEqually
    stack.axis = .horizontal
    stack.alignment = .fill
    return stack
()

然后使用 autoLayout 或其他方式将 stackView 捕捉到角落

我认为使用UIStackView 是最好的选择,对于这种简单的条件不要使用UICollectionView


选中复选框时如何更新标签状态?

我之前没有使用BEMCheckBoxGroup,只是查看了源代码,有一个函数notifyCheckBoxSelectionChanged在复选框选择更改时触发。

func notifyCheckBoxSelectionChanged(_ checkBox: BEMCheckBox) 
        if checkBox.on 
            // Change selected checkbox to this one
            selectedCheckBox = checkBox
         else if checkBox == selectedCheckBox 
            // Selected checkbox was this one, clear it
            selectedCheckBox = nil
        
    

但它不是公开的,selectedCheckBox 是您需要了解的有关此组的信息。我认为您应该将 valueChanged 上的目标添加到该组,我没有看到任何公共 API 可以委托用户选择复选框!

【讨论】:

复选框具有透明背景。我不应该看到它背后的标签吗? 我不确定,据我所知,BEMCheckBox 是否有类似fillColor 之类的属性,也请尝试更改它。 @OlivierMATROT

以上是关于尝试使用 BEMCheckBoxes 创建单选按钮组的主要内容,如果未能解决你的问题,请参考以下文章

禁用单选按钮组

Android:保存单选按钮的状态

在动态创建单选按钮方面需要帮助

Angular 2:如何从枚举创建单选按钮并添加双向绑定?

使用 django 和引导类创建单选表单的问题

如何在弹出菜单中使用单选按钮?