새소식

iOS/UIKit

[코드베이스] Creating Share Sheet in App

  • -

[참고 영상]

https://youtu.be/jxhq1_7HkJg


[학습 목표]

UIKit을 이용해 아이폰과 아이패드에서 각각 ShareSheet(UIActivityViewController)를 구현해 보자.


[구현 방법]

1. 우선은 ShareSheet을 불려올 버튼을 만들도록 하자.

import UIKit

class ViewController: UIViewController {
    
    //UIButton 코드 버튼UI이기 때문에 크게 신경 쓸 부분은 없다.
    private let button: UIButton = {
        let button = UIButton()
        button.backgroundColor = .link
        button.setTitle("Tap Me", for: .normal)
        button.setTitleColor(.white, for: .normal)
        return button
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //버튼 크기 조정.
        button.frame = CGRect(x: 0, y: 0, width: 200, height: 50)
        button.center = view.center        
        view.addSubview(button)
    }
}

 

2. 해당 버튼을 누르면 selector 함수를 이용해 Share Sheet이 나오게 만들도록 하자.

//UIButton 내부에 Selector 함수를 넣도록 하자.
private let button: UIButton = {
    //button을 누르면 selector 함수가 발동한다.
    button.addTarget(self, action: #selector(presentShareSheet), for: .touchUpInside)
}()

@objc private func presentShareSheet() {
    //저장할때의 image이기에 크게 신경쓸 부분은 없다.
    guard let image = UIImage(systemName: "bell"), let url = URL(string: "https://www.google.com") else {
        return
    }

    //UIACtivityViewController를 활용한 Share Sheet 구현.
    let shareSheetVC = UIActivityViewController(
        activityItems: [
            image,
            url
        ], applicationActivities: nil
    )
    present(shareSheetVC, animated: true)
}

이와 같은 코드를 이용해 구현이 가능하다.

 

전체 코드

import UIKit

class ViewController: UIViewController {
    
    //UIButton 코드 버튼UI이기 때문에 크게 신경 쓸 부분은 없다.
    private let button: UIButton = {
        let button = UIButton()
        button.backgroundColor = .link
        button.setTitle("Tap Me", for: .normal)
        button.setTitleColor(.white, for: .normal)
        //button을 누르면 selector 함수가 발동한다.
        button.addTarget(self, action: #selector(presentShareSheet), for: .touchUpInside)
        return button
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //버튼 크기 조정.
        button.frame = CGRect(x: 0, y: 0, width: 200, height: 50)
        button.center = view.center        
        view.addSubview(button)
    }
    
    @objc private func presentShareSheet() {
    	//저장할때의 image이기에 크게 신경쓸 부분은 없다.
        guard let image = UIImage(systemName: "bell"), let url = URL(string: "https://www.google.com") else {
            return
        }
        
	    //UIACtivityViewController를 활용한 Share Sheet 구현.
        let shareSheetVC = UIActivityViewController(
            activityItems: [
                image,
                url
            ], applicationActivities: nil
        )
        present(shareSheetVC, animated: true)
    }   
}

이제 아이폰에서 구현이 완료되었다면 iPad 에서 구현을 해보도록 하자.

만약 해당 코드를 그대로 아이패드에서 사용을 한다면 오류가 났을 것이다.

아이폰의 경우에는 UIActivityViewController가 밑에서 자동으로 나오지만 iPad에서는 아니기에 우리는 해당 위치를 조정해 줘야 하기 때문이다.

 

1. presentShareSheet 함수에 sender를 이용해 버튼의 위치를 보내주도록 하자.

//button 내부에서 Selector 함수에서 메소드 보내는 부분을 수정하자.
button.addTarget(self, action: #selector(presentShareSheet(_ : )), for: .touchUpInside)

//presentShareSheet 선언 부분을 바꿔주도록 하자.
@objc private func presentShareSheet(_ sender: UIButton)

 

2. sender를 이용해서 보낸 정보를 이용해 frame 정보를 보내주자.

shareSheetVC.popoverPresentationController?.sourceView = sender
shareSheetVC.popoverPresentationController?.sourceRect = sender.frame

 

 

전체 코드

import UIKit

class ViewController: UIViewController {
    
    private let button: UIButton = {
        let button = UIButton()
        button.backgroundColor = .link
        button.setTitle("Tap Me", for: .normal)
        button.setTitleColor(.white, for: .normal)
        button.addTarget(self, action: #selector(presentShareSheet(_ : )), for: .touchUpInside)
        return button
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        button.frame = CGRect(x: 0, y: 0, width: 200, height: 50)
        button.center = view.center
        
        view.addSubview(button)
    }
    
    @objc private func presentShareSheet(_ sender: UIButton) {
        guard let image = UIImage(systemName: "bell"), let url = URL(string: "https://www.google.com") else {
            return
        }
        
        let shareSheetVC = UIActivityViewController(
            activityItems: [
                image,
                url
            ], applicationActivities: nil
        )
        shareSheetVC.popoverPresentationController?.sourceView = sender
        shareSheetVC.popoverPresentationController?.sourceRect = sender.frame
        present(shareSheetVC, animated: true)
    }   
}

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.