Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS中模拟YouTube迷你播放器_Ios_Swift_Youtube - Fatal编程技术网

在iOS中模拟YouTube迷你播放器

在iOS中模拟YouTube迷你播放器,ios,swift,youtube,Ios,Swift,Youtube,在YouTube应用程序中,我可以通过右下角的迷你播放器(见下面标题为“TheChainSmokers”的视频)继续观看视频,在我浏览应用程序时,该播放器位于所有其他视图控制器的顶部。无论我在哪一页,我都可以在迷你播放器中观看视频 如果从迷你播放器向上拖动,视频的整个视图控制器将出现。但它总是在其他页面的顶部。我试图了解如何使用Swift复制此方法,以便可以从任何页面观看视频 我的应用程序的结构是通过UIPageViewController。我嵌入了三个独特的导航控制器(用于滑动导航目的(参见下

在YouTube应用程序中,我可以通过右下角的迷你播放器(见下面标题为“TheChainSmokers”的视频)继续观看视频,在我浏览应用程序时,该播放器位于所有其他视图控制器的顶部。无论我在哪一页,我都可以在迷你播放器中观看视频

如果从迷你播放器向上拖动,视频的整个视图控制器将出现。但它总是在其他页面的顶部。我试图了解如何使用Swift复制此方法,以便可以从任何页面观看视频

我的应用程序的结构是通过
UIPageViewController
。我嵌入了三个独特的导航控制器(用于滑动导航目的(参见下面的代码))。我想了解如何使用迷你播放器。在YouTube上,这像是一个迷你模式VC吗?它在结构上是如何布置的,如果你知道的话,我怎样才能把它融入到我目前的布局中呢

class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    private var pages: [UINavigationController]!

    private var currentPageIndex: Int!

    override func viewDidLoad() {
        super.viewDidLoad()
            self.dataSource = self
            self.delegate = self

            self.pages = [
                self.storyboard!.instantiateViewControllerWithIdentifier("Nav1") as! UINavigationController,
                self.storyboard!.instantiateViewControllerWithIdentifier("Nav2") as! UINavigationController,
                self.storyboard!.instantiateViewControllerWithIdentifier("Nav3") as! UINavigationController
            ]

            (self.pages[0].topViewController as! Nav1).parentPageViewController = self
            (self.pages[1].topViewController as! Nav2).parentPageViewController = self
            (self.pages[2].topViewController as! Nav3).parentPageViewController = self


            self.currentPageIndex = 1
            let startingViewController = self.pages[1] as UINavigationController
            self.setViewControllers([startingViewController], direction: .Forward, animated: false, completion: nil)
}
func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
        let index = (self.pages as NSArray).indexOfObject(viewController)
        self.currentPageIndex = index

        // if currently displaying last view controller, return nil to indicate that there is no next view controller
        return (self.currentPageIndex == self.pages.count - 1 ? nil : self.pages[self.currentPageIndex + 1])
    }
func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
        let index = (self.pages as NSArray).indexOfObject(viewController)
        self.currentPageIndex = index

        // if currently displaying first view controller, return nil to indicate that there is no previous view controller
        return (index == 0 ? nil : self.pages[index - 1])
    }
func displayPageForIndex(index: Int, animated: Bool = true) {
        assert(index >= 0 && index < self.pages.count, "Error: Attempting to display a page for an out of bounds index")

        // nop if index == self.currentPageIndex
        if self.currentPageIndex == index { return }

        if index < self.currentPageIndex {
            self.setViewControllers([self.pages[index]], direction: .Reverse, animated: true, completion: nil)
        } else if index > self.currentPageIndex {
            self.setViewControllers([self.pages[index]], direction: .Forward, animated: true, completion: nil)
        }

        self.currentPageIndex = index
    }

}
类PageViewController:UIPageViewController、UIPageViewControllerDataSource、UIPageViewControllerDelegate{
私有变量页:[UINavigationController]!
私有变量currentPageIndex:Int!
重写func viewDidLoad(){
super.viewDidLoad()
self.dataSource=self
self.delegate=self
self.pages=[
self.storyboard!。实例化eviewcontrollerwhiteIdentifier(“Nav1”)为!UINavigationController,
self.storyboard!。实例化eviewcontrollerwhiteIdentifier(“Nav2”)为!UINavigationController,
self.storyboard!。实例化eviewcontrollerwhiteIdentifier(“Nav3”)为!UINavigationController
]
(self.pages[0]。topViewController为!Nav1)。parentPageViewController=self
(self.pages[1]。topViewController为!Nav2)。parentPageViewController=self
(self.pages[2]。topViewController为!Nav3)。parentPageViewController=self
self.currentPageIndex=1
让startingViewController=self.pages[1]作为UINavigationController
self.setViewController([startingViewController],方向:。正向,动画:false,完成:nil)
}
func pageViewController(pageViewController:UIPageViewController,viewControllerAfterViewController:UIViewController)->UIViewController{
让index=(self.pages作为NSArray.indexOfObject(viewController)
self.currentPageIndex=索引
//如果当前显示最后一个视图控制器,则返回nil以指示没有下一个视图控制器
返回(self.currentPageIndex==self.pages.count-1?nil:self.pages[self.currentPageIndex+1])
}
func pageViewController(pageViewController:UIPageViewController,viewController预览控制器viewController:UIViewController)->UIViewController{
让index=(self.pages作为NSArray.indexOfObject(viewController)
self.currentPageIndex=索引
//如果当前显示第一个视图控制器,则返回nil以指示没有以前的视图控制器
返回(索引==0?无:self.pages[索引-1])
}
func displayPageForIndex(索引:Int,动画:Bool=true){
断言(索引>=0&&indexself.currentPageIndex,则为else{
self.setViewControllers([self.pages[index]],方向:。正向,动画:true,完成:nil)
}
self.currentPageIndex=索引
}
}

这很容易做到。您将为UIWindow创建子类,添加一个迷你播放器视图,并确保它始终位于视图层次结构的顶部。首先在
AppDelegate
中添加此代码以覆盖窗口:

/*!
 *  Subclassing UIWindow
 */
-(UIWindow *)window
{
    static YourWindow *customWindow = nil;
    if (!customWindow) customWindow = [[YourWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    return customWindow;
}
现在在
YourWindow
类中,添加
miniPlayer

-(void)awakeFromNib
{
    [self addMiniPlayer];
}

-(void)addMiniPlayer
{
    UIView *miniPlayer = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)]; //change to your frame here
    [self addSubview:miniPlayer];
    miniPlayer.backgroundColor = [UIColor redColor];
    self.miniPlayer = miniPlayer;
}

-(void)layoutSubviews
{
    [super layoutSubviews];
    [self bringSubviewToFront:self.miniPlayer];

    // You would like to update your miniplayer frame here.
    //CGRect frame = self.miniPlayer.frame;
    //frame.origin.x = self.frame.size.width - frame.size.width - 5;
    //frame.origin.y = 70;
    //self.appInfoLabel.frame = frame;
} 
现在,您的工作是调整
迷你播放器的行为。您可以从
AppDelegate
访问它,类似这样:
self.window.miniPlayer


更新:以下是Swift编写的一个示例:

我将采用“更高”的方法,添加一个UIWindow,该窗口在向下移动时隐藏其底部内容并缩小,在向上移动时反转过程。那么,它背后的“目录”就不那么明智了,只要用户点击一个新的“目录项”就可以进行通信。我仍然对视图的层次结构感到困惑。完整的歌曲页面是它自己的视图控制器。但当最小化时,它仍然是视图控制器还是自定义视图?我可以把它放在PageViewController的视图上,这样所有页面都可以访问它吗?我甚至不需要最小化它。如果我可以将
UIWebView
从一个VC传递到
UIPageViewController
的视图,并使其可以从所有页面访问,那没关系,因为我现在使用的是objc,但是如果你需要Swift版本,它很容易转换成Swift。你能详细介绍一下
你的窗口
?这是什么,我用它干什么?我添加迷你播放器的
YourWindow
类是什么?这是我的应用程序del中的自定义类吗?它是
UIWindow
的子类。看看我的答案,我演示了一种在加载窗口时添加迷你播放器的方法。尝试使用框架和背景,您将看到一个小视图始终位于视图顶部。是的,但当我声明
静态YourWindow*customWindow
以及在我的
YourWindow
类中时,我实际上不理解
YourWindow
是什么。什么是我的
YourWindow
课程?这就是我要求细化的原因。默认情况下,所有iOS应用程序在启动时都会创建一个窗口。然后,您将创建视图控制器并将其视图添加到此风中