UIPopoverPresentationController에서 표시 위치에 대해 시도해 보았습니다.

6927 단어 XcodeSwiftiPad

소개



종래 사용하고 있던 UIPopoverController 클래스가 iOS9에서 폐지되어 새로운 클래스(UIPopoverPresentationController)로 바꾸는 작업을 하고 있었습니다만, 문서를 읽어도 모르는 적이 있었으므로 메모해 둡니다.

몰랐던 것



Popover 표시 장소를 결정하는 프로퍼티 sourceView , sourceRect 에 무엇을 지정하면 좋을까.
Apple 문서에는 이렇게 설명되어 있습니다.



그래. . . .

코드를 작성해 보았습니다.



코멘트에 간단한 설명을 쓰고 있습니다만, yellowView와 redRect의 관계를 주목.

ViewController.swift
class ViewController: UIViewController {

    @IBOutlet weak var yellowView: UIView!

    let redRect = CGRect(x: 200, y: 100, width: 50, height: 10)

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        let testView = UIView(frame: redRect)
        testView.backgroundColor = UIColor.red
        yellowView.addSubview(testView)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func openPopover(_ sender: UIButton) {

        let contentVC = PopoverContentViewController(style: .plain)

        //Popoverスタイル
        contentVC.modalPresentationStyle = .popover

        //Popoverコンテンツのサイズ
        contentVC.preferredContentSize = CGSize(width: 150, height: 100)

        //場所を決める
        contentVC.popoverPresentationController?.sourceView = yellowView
        contentVC.popoverPresentationController?.sourceRect = redRect
//        contentVC.popoverPresentationController?.sourceView = sender
//        contentVC.popoverPresentationController?.sourceRect = sender.bounds

        //方向
        contentVC.popoverPresentationController?.permittedArrowDirections = .any

        contentVC.popoverPresentationController?.delegate = self
        present(contentVC, animated: true, completion: nil)

    }
}

extension ViewController : UIPopoverPresentationControllerDelegate {

}


그리고 결과를 보면,



알다시피



정말 쉬운 일이었습니다.
sourceView는 sourceRect의 기준이 되는 영역(View)이 됩니다.
그리고 sourceRect는 Popover를 표시하는 영역입니다.
sourceViewUIScrollView 또는 UITableViewContentView 의 경우, sourceRect 의 지정에 offset 에 근거해 지정하는 것입니다.

예제 코드에서는 작성하지 않았지만 tableView의 셀을 탭하면 offset을 반영한 sourceRect를 지정했는데 예상대로 표시되는 것을 확인했습니다.

이상.

좋은 웹페이지 즐겨찾기