无法居中弹出框 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 = Horizontal
和 Paging 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的主要内容,如果未能解决你的问题,请参考以下文章