Попытка сделать группу переключателей с BEMCheckBoxes - PullRequest
0 голосов
/ 13 апреля 2020

Я бы хотел создать группу переключателей, которая будет выглядеть так, когда уже ничего не проверено, используя BEMCheckBoxes :

enter image description here

Мне кажется, что я не могу просто добавить число в кнопке.

Поэтому я решил создать вид с меткой и флажком по центру.

Здесь это код, который у меня есть:

// 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);
}

Результат не тот, который я ожидаю, но я не могу понять, что не так:

enter image description here

Почему мои флажки не прозрачны, чтобы позволить появиться метке? Также очевидно, что существует проблема распространения в UIStackView.

Любая помощь приветствуется.

Метод расширения привязки:

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 : Только что с помощью инструмента «Выявить» обнаружил, что размер «Мои метки» был неоднозначным.

var label = new UILabel ();

становится

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

Это решает проблему «невидимой метки».

1 Ответ

0 голосов
/ 14 апреля 2020

мой ответ Свифт кодов, но дает Вам концепцию работ. Я предлагаю Вам разбить проблему на простые шаги. просто попробуйте правильно расположить флажки (BEMCheckBox) на UIStackView, затем создайте пользовательский вид, содержащий 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
}()

затем привязать stackView к углам, используя autoLayout или что-то еще

Я думаю, использование 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
        }
    }

но это не публично c, selectedCheckBox - это то, что вам нужно знать об этой группе. Я думаю, что вы должны добавить целевой объект на valueChanged в эту группу, я не вижу никакого publi c API для делегирования пользователю выбора флажков!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...