[iOS] UIActivityViewController

RudinP·2025년 5월 15일
0

Study

목록 보기
265/273

공유기능

iOS에서 공유하기를 눌렀을 때 표시되는 뷰(ShareSheet)를 구현할 수 있다.

예시

@IBAction func share(_ sender: Any) {
	let dataToShare = contentTextView.text
    
    let activityViewController = UIActivityViewController(activityItems: [dataToShare], 
    applicationActivities: nil)
    
    present(cativityViewController, animated: true)
}

ShareSheet에 원하는 이미지, 타이틀 표시

  • 공유하는 아이템이 텍스트: 기본 아이콘텍스트 자체가 타이틀로 표시된다.
  • 이미지: 아이콘과 텍스트가 표시되지 않은채 빈값으로 표시된다.
  • 공유하는 아이템을 별도의 타입으로 구현 후 프로토콜을 사용해야 표시 가능하다.
  1. 보통 이름은 ~ActivityItem으로 짓는다.
  2. LinkPresentation, UniformTypeIdentifiers를 임포트한다.
  3. NSObject, UIActivityItemSource 프로토콜을 채용한다.

LinkPresentation

  • ActivityItem을 표시하는데 필요한 Api가 구현된 클래스

UniformTypeIdentifiers

  • 공유할 데이터의 타입을 리턴하는데 필요한 Api가 구현된 클래스

예시

import UIKit
import LinkPresentation
import UniformTypeIdentifiers

class ImageActivityItem: NSObject, UIActivityItemSource {
	let image: UIImage
    let title: String
    let subtitle: String?
    
    init(image: UIImage, title: String, subtitle: String? = nil) {
    	self.image = image
        self.title = title
        self.subtitle = subtitle
    }
    
    //필수 메소드: placeHolder로 사용할 아이템 리턴
    func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
    	return title
    }
    
    //필수 메소드: 실제로 공유할 데이터를 여기서 리턴
    func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
    	return image
    }
    
    //제목으로 사용할 문자열 리턴
    func activityViewController(_ activityViewController: UIActivityViewController, subjectForActivityType activityType: UIActivity.ActivityType?) -> String {
    	return title
    }
    
    //공유할 데이터의 타입 리턴. 구현 안해도 되긴 함.
    //다만 위의 아이템 리턴 메소드에서 Any로 처리됨(일반 타입으로 아이템이 처리됨)
    func activityViewController(_ activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: UIActivity.ActivityType?) -> String {
    	//이미지타입으로 리턴
    	return UTType.image.identifier
    }
    
    //해당 메소드를 구현해야 깨지지 않은 아이콘으로 표시 가능
    func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {
    	let metadata = LPLinkMetaData()
        metadata.title = title
        metadata.iconProvider = NSItemProvider(object: UIImage(systemName: "photo")!)
        
        if let subtitle {
        	//subtitle이라는 속성이 없기 때문에 
        	metadata.originalURL = URL(fileURLWithPath: subtitle)
        }
        
        return metadata
    }
}
@IBAction func share(_ sender: Any) {
	guard let dataToShare = imageView.image else { return }
    let item = ImageActivityItem(image: dataToShare, title: "Image Title", subtitle: navigationItem.title)
    let activityViewController = UIAcitivityViewController(activityItems: [item], applicationActivities: nil)
    present(activityViewController, animated: true)
}

profile
iOS 개발자가 되기 위한 스터디룸...

0개의 댓글