无法居中弹出框 Swift

Posted

技术标签:

【中文标题】无法居中弹出框 Swift【英文标题】:Cannot Center Popover Swift 【发布时间】:2019-01-05 02:40:42 【问题描述】:

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

现在为了制作弹出框,我花了几个小时在谷歌上搜索如何在屏幕上制作一个矩形中心。我的代码来自互联网:

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

但是,对于我的生活,我无法理解为什么弹出框没有居中

只有当我设置 popController 的首选内容大小时,它才会失去中心。有什么想法吗?

TL:DR 我想 1) 在屏幕上居中弹出框,2) 使弹出框的比例为 1:1,以及 3) 使弹出框的宽度与父屏幕的宽度成比例。如果没有 1000 行代码,我怎么能做到这一点。

【问题讨论】:

什么是 - let width = view.frame.width 打印出来?什么是视图,什么是框架?为什么不使用自动布局?按规则完成你的问题,它缺乏信息 如何使用自动布局和弹出框?框架宽度是调用弹出框的父框架的宽度。 为什么不将 UICollectionView 与 Scroll DIrection = HorizontalPaging Enabled 一起使用。启用分页后,它将始终位于中心。 再一次,我不是在问滚动,我问的是如何使弹出框居中。 @AlexKornhauser 我不了解弹出框机制,但您可以通过自定义视图和默认动画轻松实现所需的行为。 【参考方案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
  

【讨论】:

暂时忘记刷卡,我使用的是外部库。我想 1) 使弹出框居中,2) 使布局为 1:1,以及 3) 使布局相对于屏幕的宽度。 UIPopoverController 类已被弃用,所以我建议创建一个自定义类。抱歉,我现在不在电脑前,无法回答这些问题。

以上是关于无法居中弹出框 Swift的主要内容,如果未能解决你的问题,请参考以下文章

弹出框文档居中

滚动视图中的 Swift 弹出框

弹出框居中

Swift:弹出框关闭回调

Swift 中的滑块弹出框

在 Swift 中点击按钮时显示一个弹出框