iOS Swift - Позиционирование подпредставления на основе рамки кнопки (кнопка находится внутри Вертикального стека) - PullRequest
0 голосов
/ 16 марта 2020

Обновление

После добавления метода преобразования между прямоугольным и основным представлениями позиция Y в порядке, но координата X смещена вправо наружу основного вида: Выпадающий вид (подпредставление) выключен. Основной вид Ниже находится рамка кнопки до и после метода преобразования. Основной вид - 414 x 896. Выпадающее меню как-то сдвигается вправо, как на прикрепленном изображении. рамка кнопки в стеке btnRect: (120.66666666666666, 0.0, 293.3333333333333, 30.0) рамка кнопки в главном виде: cvtRect (241.33333333333331, 190.0, 293.3333333333333, 30.0): необязательно (>)

* 1013 . Я хочу сделать выпадающий список, показывая UIView с опциями выпадающего меню под кнопкой. Кнопка находится внутри вертикального стека. Я добавляю TableView с опциями раскрывающегося списка в этот раскрывающийся список UIView. Я хочу нажать на кнопку, и у меня будет этот UIView с TableView внутри, чтобы отображаться чуть ниже кнопки. В основном, следуя этому уроку https://www.youtube.com/watch?v=D3DCPaEE4hQ, за исключением того, что моя кнопка находится внутри Вертикального стека.

Issue. UIView и TableView внутри UIView отображаются нормально, когда кнопка нажата. Проблема заключается в расположении выпадающего UIView, которое всегда имеет одинаковое происхождение X = 120, Y = 0.

Вот как я пытаюсь это сделать:

  1. У меня есть вертикальный стек с 4 рядами
  2. В 4-м ряду у меня есть метка (ширина = 120 почти такая же, как у координаты X выше) и кнопка , которая вызывает UIView для отображения
  3. Я использую кнопку для отображения выпадающего списка (в основном UIView), что должно появляться чуть ниже кнопки, когда кнопка нажата, но она всегда появляется в начале координат x = 120 Y = 0, в основном прикрепленной к вершине справа столбец в вертикальном представлении стека. Вертикальный вид стека имеет 1-й столбец с метками и второй столбец с различными элементами управления, такими как кнопки et c.
func addTransparentView(frames: CGRect)
   {
      let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
      transparentView.frame = window?.frame ?? self.view.frame

      //some of the stuff I tried to at least centre dropdownUIView 
      //transparentView.center.x = window?.center.x ?? self.view.center.x
      //transparentView.center.y = window?.center.y ?? self.view.center.y

      self.view.addSubview(transparentView)

      tvPriority.frame = CGRect(x: frames.origin.x, y: frames.origin.y + frames.width, width: frames.width, height: 0)

      //some of the stuff I tried to at least centre UIView
      //tvPriority.center = verticalStackView.convert(verticalStackView.center, from:tvPriority)     
      //tvPriority.center.x = view.center.x
      //tvPriority.center.y = view.center.y

      self.view.addSubview(tvPriority)
      tvPriority.layer.cornerRadius = 5

      transparentView.backgroundColor = UIColor.black.withAlphaComponent(0.9)
      let tapGesture = UITapGestureRecognizer(target: self, action: #selector(removeTransparentView))
      transparentView.addGestureRecognizer(tapGesture)
      transparentView.alpha = 0
      UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: UIView.AnimationOptions.curveEaseInOut, animations: {self.transparentView.alpha = 0.5
         self.tvPriority.frame = CGRect(x: frames.origin.x, y: frames.origin.y + frames.height, width: frames.width, height: 193)
      }, completion: nil)
   }
Чтобы успешно сделать выпадающий список, мне нужно, чтобы UIView отображалось чуть ниже рамки кнопок (X, Y, ширина, высота). Но хотя кнопка находится в 4-й строке, которая должна располагаться с гораздо более высоким значением Y, рамка кнопок всегда имеет значение X = 120, Y = 0, поэтому мой UIView всегда закреплен в этом месте над кнопкой, которая должна имитировать выпадающий список.

Вопросы 1. Чего мне не хватает при позиционировании выпадающего UIView? Почему кнопки находятся в положении Y = 0, когда кнопка находится в 4-м ряду Вертикального просмотра стека с явно более высокой позицией Y? Я также попытался просто расположить этот выпадающий список в центре экрана, но это также не работает.

2. Я перешел на iOS разработку из мира веб-разработки, и я Я использовал выпадающий список в моей карьере. Должен ли я просто использовать Picker View вместо этого? Или оповещение? Каков наиболее распространенный и стандартный способ предоставления пользователю списка взаимоисключающих опций в приложении Swift?

Большое спасибо

1 Ответ

0 голосов
/ 16 марта 2020

Ваша кнопка является подпредставлением stackView, поэтому ее фрейм относительно фрейма stackView.

Чтобы получить свой фрейм (прямоугольник) в координатном пространстве представления, вам нужно использовать .convert. Назначьте это действие одной из ваших кнопок в stackView:

EDIT Исправлен пример кода ... Я не проверял его перед публикацией.

class ConvertViewController: UIViewController {

    @IBOutlet var dropDownView: UIView!

    @IBAction func didTap(_ sender: Any) {
        guard let btn = sender as? UIButton else {
            fatalError("Sender is not a button!")
        }
        guard let sv = btn.superview as? UIStackView else {
            fatalError("Sender is not in a stackView!")
        }

        let btnRect = btn.frame
        let cvtRect = sv.convert(btn.frame, to: view)
        print("button frame in stackView:", btnRect)
        print("button frame in main view:", cvtRect)

        let dropDownRect = dropDownView.bounds
        let cvtCenterX = cvtRect.origin.x + (cvtRect.size.width / 2.0)
        let viewX = cvtCenterX - (dropDownRect.width / 2.0)
        let newOrigin = CGPoint(x: viewX, y: cvtRect.minY + cvtRect.height)
        dropDownView.frame.origin = newOrigin

    }

}

Если вы смотрите на вывод в консоли отладки, вы должны увидеть что-то вроде этого:

button frame in stackView: (0.0, 114.0, 46.0, 30.0)
button frame in main view: (164.5, 489.5, 46.0, 30.0)

Как вы можете видеть, прямоугольник (рамка) моей 4-й кнопки в моем stackView имеет источник 0.0, 114.0 , но после преобразования его в мое view координатное пространство исходная точка прямоугольника будет 164.5, 489.5.

Теперь вы можете расположить «выпадающий список» относительно преобразованного прямоугольника.

Как примечание, вы можете посмотреть на UIPopoverPresentationController.

...