在屏幕上部分显示弹出窗口

时间:2017-03-21 04:25:57

标签: ios swift3

我正在尝试重新创建iOS上的YouTube移动应用所具有的效果,当视频以全屏横向模式播放时。只是窗口的顶部(下一个/推荐的视频)是可见的,向上滑动显示它们与视频重叠(在后台继续运行)。向下滑动会再次隐藏它们。

所以我在视频控制器中添加了以下代码,以横向模式显示视频:

    private func showPopover() {
    let popoverController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "popoverController")

    popoverController.modalPresentationStyle = .popover
    popoverController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
    popoverController.popoverPresentationController?.delegate = self
    let desiredWidth:CGFloat = 200
    let desiredHeight:CGFloat = 300

    // Initially it's at low right corner
    let origin = CGPoint(x: (self.view.superview?.frame.width)! - desiredWidth - 10, y: (self.view.superview?.frame.height)! - 10)
    let size = CGSize(width: desiredWidth, height: desiredHeight)
    popoverController.popoverPresentationController?.sourceRect = CGRect(origin: origin, size: size)
    popoverController.popoverPresentationController?.sourceView = popoverController.view
    self.present(popoverController, animated: true, completion: nil)
}

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .none
}

弹出窗口很好,但总是完全在屏幕上。我需要它只是部分可见(如果可能的话,只有前10个像素)。但有些事情阻止了视图控制器的定位。

screenshot

如何移动弹出窗口以便只显示前10个像素?它看起来应该如下图所示(注意:这是通过编辑图像而不是以编程方式生成的):

desired state

2 个答案:

答案 0 :(得分:1)

替换它:

popoverController.popoverPresentationController?.sourceView = popoverController.view

用这个:

popoverController.popoverPresentationController?.sourceView = self.view

<强>更新

好的,我现在明白了。我的答案是不可能只展示一些popover。

我的建议是使用UITableViewController作为你的弹出窗口并使其高度足以显示第一行,在这种情况下是文本。

然后,在optional func scrollViewDidScroll(_ scrollView: UIScrollView)委托方法中,实施逻辑以检测向上滑动以显示并向下滑动以隐藏。

答案 1 :(得分:0)

找到了一种方法,这很容易(事后看来,当然!)。将 self.present(popoverController, animated: true) { popoverController.popoverPresentationController?.presentedView?.center = CGPoint(x: (self.view.superview?.frame.width)! - desiredWidth - 10, y: (self.view.superview?.frame.height)! + 100) } 函数的最后一行更改为:

string textFileName = "efsd.txt";
ofstream textFile(textFileName.c_str());
string directory;

我将获得一个特定的数字,而不是使用100,但视图移动到这个位置没有任何问题。