Не удается отцентрировать Popover Swift - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь создать поповер, который позволит пользователям перемещаться между изображениями (есть ли лучший подход к этому, чем использование поповера?).

Прямо сейчас, чтобы сделать поповер, я часами гуглял, как просто сделать прямоугольник в центре экрана. Из интернета мой код:

    // get a reference to the view controller for the popover
    let popController = UIStoryboard(name: "Event", bundle: nil).instantiateViewController(withIdentifier: "carouselPopover")

    // set the presentation style
    popController.modalPresentationStyle = UIModalPresentationStyle.popover

    let width = view.frame.width
    popController.preferredContentSize = CGSize(width: width, height: 300)
    // set up the popover presentation controller
    popController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.up
    popController.popoverPresentationController?.delegate = self
    popController.popoverPresentationController?.sourceView = self.view
    popController.popoverPresentationController?.sourceRect = CGRect(x: view.bounds.midX, y: view.bounds.midY, width: 0, height: 0)
    popController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)

    // present the popover
    self.present(popController, animated: true, completion: nil)

Однако, по жизни я не могу понять, почему поповер не центрируется enter image description here

Он теряет свой центр только тогда, когда я устанавливаю предпочтительный размер содержимого popController. Есть мысли?

TL: DR Я хочу 1) центрировать поповер на экране, 2) сделать соотношение поповеров 1: 1, и 3) сделать ширину поповера пропорциональной ширине родительского экрана. Как я могу сделать это без 1000 строк кода.

1 Ответ

0 голосов
/ 05 января 2019

Вы можете создать собственный класс popover. Затем вы устанавливаете шаблоны делегатов, чтобы определить, выполняется ли пользователь.

protocol PopoverDelegate: class {
  func imageviewDidSwipe(_ popover: Popover)
}

class Popover: UIView {

weak var delegate: PopoverDelegate?

  init(frame: CGRect) {
   super.init(frame: frame)
   backgroundColor = UIColor.white
  }

  func setupImage(_ image: UIImage) {
    let imageView = UIView(frame: CGRect.zero)
    imageView.image = image
    self.addSubview(imageView)

    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
    imageView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    imageView.heightAnchor.constraint(equalToConstant: 50).isActive = true // However big you want
    imageView.widthAnchor.constraint(equalToConstant: 50).isActive = true // However big you want
  }

  func showPopover(over view: UIView) {
    view.addSubview(self)
    translatesAutoResizingMaskIntoConstraints = false
    centerXAnchor.contraint(equalTo: view.centerXAnchor).isActive = true
    centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    heightAnchor.constraint(equalToConstant: frame.height).isActive = true
    widthAnchor.constraint(equalToConstant: frame.width).isActive = true
 }

}

Для использования ...

class vC: UIViewController {

  func ImageOnClick() {
   // change view to where you want popover to show on top of
   let popover = Popover(frame: view.frame)
   popover.setupImage(image.png)
   popover.delegate = self
   showPopover(over: view)
  }

}

extension vC: PopoverDelegate {
  func imageviewDidSwipe(_ popover: Popover) {
    // image swiped
  }
}
...