我试图在另一个视图控制器上呈现模式视图控制器,该视图控制器的大小为父视图控制器的一半.但它总是以全屏显示.

我已经在我的故事板中创建了具有固定帧大小的自由形式大小的视图控制器.320 X 250.

var storyboard = UIStoryboard(name: "Main", bundle: nil)
var pvc = storyboard.instantiateViewControllerWithIdentifier("CustomTableViewController") as ProductsTableViewController
self.presentViewController(pvc, animated: true, completion: nil)

我试着设定一个框架.superview和它没有帮助.

图片示例

请给出建议.

推荐答案

你可以用UIPresentationController来实现这一点.

为此,您让演示ViewController实现UIViewControllerTransitioningDelegate,并为半尺寸演示返回PresentationController:

func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
    return HalfSizePresentationController(presentedViewController: presented, presenting: presentingViewController)
}

演示时,将演示样式设置为.Custom,并将过渡代理设置为:

pvc.modalPresentationStyle = .custom
pvc.transitioningDelegate = self

演示控制器仅返回演示视图控制器的帧:

class HalfSizePresentationController: UIPresentationController {
    override var frameOfPresentedViewInContainerView: CGRect {
        guard let bounds = containerView?.bounds else { return .zero }
        return CGRect(x: 0, y: bounds.height / 2, width: bounds.width, height: bounds.height / 2)
    }
}

以下是完整的工作代码:

class ViewController: UIViewController, UIViewControllerTransitioningDelegate {

    @IBAction func tap(sender: AnyObject) {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let pvc = storyboard.instantiateViewController(withIdentifier: "CustomTableViewController") as! UITableViewController

        pvc.modalPresentationStyle = .custom
        pvc.transitioningDelegate = self
        pvc.view.backgroundColor = .red

        present(pvc, animated: true)
    }
    
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
        return HalfSizePresentationController(presentedViewController: presented, presenting: presentingViewController)
    }
}

class HalfSizePresentationController: UIPresentationController {
    override var frameOfPresentedViewInContainerView: CGRect {
        guard let bounds = containerView?.bounds else { return .zero }
        return CGRect(x: 0, y: bounds.height / 2, width: bounds.width, height: bounds.height / 2)
    }
}

Swift相关问答推荐

操作员如何点逻辑非(.!)在Swift工作?

如何在SWIFT中使用DiscardingTaskGroup获得任务结果

如何在AudioKit中实现自定义音效 node ?

我可以为UIMenu设定一个固定的订单吗?

如何写一个;风格;视图修饰符,它会影响特定类型的所有嵌套视图?

无论玩家移动到视图内的哪个位置,如何使用 SpriteKit 让敌人向玩家emits 子弹?

UIImage和UIimage.pngData返回两个不同的图像

如何在闭包中使用构造 await sync

当变量首次用于其自己的初始化时,如何清除变量...在初始化之前使用错误?

TextField 键入未完成

将基于MyProtocol的泛型函数的参数更改为使用存在的any MyProtocol或some MyProtocol是否会受到惩罚?

任何使 ScrollView 像 List 一样执行更灵活的修饰符?

Xcode 13.3 将函数调用更改为属性访问

在 Swift 4 中实现自定义解码器

使用自定义相机拍照 iOS 11.0 Swift 4. 更新错误

在 Swift 中返回实例类型

在swift 3中将文件保存在文档目录中?

在 xcode8 中找不到 ModuleName-Swift.h 文件

如何快速格式化用户显示(社交网络等)的时间间隔?

迭代 Firebase 中的子快照