iOS에서 공유하기를 눌렀을 때 표시되는 뷰(ShareSheet)를 구현할 수 있다.
@IBAction func share(_ sender: Any) {
let dataToShare = contentTextView.text
let activityViewController = UIActivityViewController(activityItems: [dataToShare],
applicationActivities: nil)
present(cativityViewController, animated: true)
}
기본 아이콘
과 텍스트 자체가 타이틀
로 표시된다.빈값
으로 표시된다.~ActivityItem
으로 짓는다.LinkPresentation
, UniformTypeIdentifiers
를 임포트한다.NSObject
, UIActivityItemSource
프로토콜을 채용한다.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)
}