无法居中弹出雨燕

时间:2019-01-05 02:40:43

标签: ios swift uipopovercontroller

我正在尝试制作一个弹出框,以允许用户在图像之间滑动(比使用弹出框有更好的方法吗?)。

现在要制作弹出窗口,我花了几个小时来研究如何在屏幕上制作矩形中心。在互联网上,我的代码是:

    // 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 :(得分:1)

您可以创建一个自定义弹出类。然后,您可以建立委托模式以确定用户是否滑动。

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
  }
}