iPad开发之Popover

首先了解两个控制器:

  • UIPopoverPresentationController:继承自UIPresentationController
  • UIPresentationController:继承自NSObject,它为被展示的视图(presented view controller)提供了视图和转场管理。可以通过被展示的视图的presentationController属性来获取它。

popover相当于第二窗口或对话框,它展示的视图位于主界面顶部。通常,它通过箭头与主界面上的一个视图关联,一般该视图是用户用来召唤popover的按钮。popover可能是一个modal(模态)形式,禁止用户同界面剩下的部分交互;同时,popover也可能是这样的形式:用户点击外面的部分时,它就会消失。

iOS8及以后的版本中,popover实际上是一种presented view controller(被展示的视图控制器)的形式—-presented view controller的modalPresentationStyle.Popover。presented view controller具有适配性。一个.Popover和.FormSheet类型的presented view controller在iPhone上会被默认设置为.FullScreen类型。而且,如果你不想接受默认的设置,你也可以修改,让popover也可以作为popover出现在iPhone上。

一.准备一个Popover

为了显示popover,你需要展示一个视图控制器。通过设置视图控制器的modalPresentationStyle属性为.Popover,来将展示转变为popover展示。

let pop = Popover()//Popover是视图控制器类
        pop.modalPresentationStyle = .Popover
        self.presentViewController(pop, animated: true, completion: nil)

但是,这还不足够,因为没有进一步的配置,运行时,popover一展示应用就会崩溃。如图:

额外的配置是通过UIPopverPresentationController(负责展示这个popover)来实现的,将视图控制器的modalPresentationStyle设置为.Popover可以让它的presentationController变成UIPopverPresentationController,那么,视图控制器的popoverPresentatonController指向UIPopverPresentationController

注意:视图控制器可以有两个属性:

  • presentationController
  • popoverPresentationController

二.Arrow source and direction(箭头源和方向)

UIPopverPresentationController至少需要你执行下面其中一个设置:

  • barButtonItem:界面上的一个barbuttonitem,popover应当与其关联。popover的箭头会指向这个barbuttonitem。通常点击这个barbuttonitem会召唤popover。
  • sourceView,sourceRect:界面上的一个视图,popover应当与其关联。popover的箭头会指向这个视图,通常点击这个视图会召唤popover。其中,sourceView就是这个视图,而sourceRect就是它的bounds。

下面是可以工作的最小的popover展示示例,通过点击界面上的UIButton来召唤popover,下面是示例代码:

ViewController.swift文件代码:

import UIKit

class ViewController: UIViewController {

    var source : UIButton?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.grayColor()
        let source = UIButton(frame: CGRectMake(0,100,100,44))
        self.view.addSubview(source)
        self.source = source
        self.source!.backgroundColor = UIColor.orangeColor()
        self.source!.addTarget(self, action: "doButton:", forControlEvents: .TouchUpInside)
    }



    func doButton(sender: AnyObject) {

        let pop = Popover()
        pop.modalPresentationStyle = .Popover
        self.presentViewController(pop, animated: true, completion: nil)
        if let p = pop.popoverPresentationController {
            let v = sender as! UIView
            p.sourceView = v
            p.sourceRect = v.bounds
        }

    }

}

除了设置箭头源外,你还可以设置箭头方向,利用属性permittedArrowDirections设置,这是位掩码(bitmask),可能的值有.Up.Down.Left.Right,默认是.Any

三.Popover尺寸和位置

如果你不为popover提供尺寸的话,它也可以展示。但是你可能想要提供一个尺寸,因为默认的不一定是你想要的。你可以设置被展示的视图控制器的preferredContentSize来通过尺寸。

回忆一下,视图控制器可以使用它的preferredContentSize来告诉父视图控制器它想要的尺寸是多少。UIPresentationController实现了UIContentContainer协议,presentation controller作为被展示的视图控制器的父视图控制器,所以你设置被展示的视图控制器的preferredContentSize来通过尺寸。

if let p = pop.popoverPresentationController {
            let v = sender as! UIView
            p.sourceView = v
            p.sourceRect = v.bounds
            pop.preferredContentSize = CGSizeMake(100, 240)
        }

…..未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值