【问题标题】:Avoid popover adapting to fullscreen in horizontally compact environment避免在水平紧凑环境下弹出适应全屏
【发布时间】:2020-11-01 15:03:33
【问题描述】:

根据documentation

在水平紧凑的环境中,弹出框适应 UIModalPresentationOverFullScreen 默认呈现样式。

见下图。在紧凑的环境中,popover 从底部出现并动画到顶部直到覆盖整个屏幕。

是否可以覆盖此行为并让弹出框仅覆盖屏幕的特定高度,如下所示?

以下代码演示了在紧凑环境中弹出框适应全屏演示样式的默认行为。

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .systemBackground
        
        let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setImage(UIImage(systemName: "square.grid.2x2.fill"), for: .normal)
        button.addTarget(self, action: #selector(displayPopover), for: .touchUpInside)
        self.view.addSubview(button)
        
        NSLayoutConstraint.activate([
            button.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100),
            button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            button.widthAnchor.constraint(equalToConstant: 40),
            button.heightAnchor.constraint(equalToConstant: 40),
        ])
        
    }
    
    @IBAction func displayPopover(sender: UIButton!) {
        let popoverVC = PopoverViewController()
        popoverVC.preferredContentSize = CGSize(width: 300, height: 200)
        popoverVC.modalPresentationStyle = .popover
        popoverVC.popoverPresentationController?.sourceView = sender
        popoverVC.popoverPresentationController?.permittedArrowDirections = .up
        self.present(popoverVC, animated: true, completion: nil)
    }
    
    
}

class PopoverViewController: UIViewController {
    override func viewDidLoad() {
        self.view.backgroundColor = .systemGray
    }
}

输出:

谢谢你????‍♂️

【问题讨论】:

    标签: ios swift popover


    【解决方案1】:

    iOS 15 现已提供此功能。

    观看 WWDC2021 短片video

    here下载WWDC示例项目

     @IBAction func showImagePicker(_ sender: UIBarButtonItem) {
        
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.modalPresentationStyle = .popover
        if let popover = imagePicker.popoverPresentationController {
            popover.barButtonItem = sender
            
            let sheet = popover.adaptiveSheetPresentationController
            sheet.detents = [.medium(), .large()]
            sheet.largestUndimmedDetentIdentifier = .medium
            sheet.prefersScrollingExpandsWhenScrolledToEdge = false
            sheet.prefersEdgeAttachedInCompactHeight = true 
            sheet.widthFollowsPreferredContentSizeWhenEdgeAttached = true
        }
        
        present(imagePicker, animated: true, completion: nil)
    }
    

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-09
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多