2016-11-06 11 views
2

さまざまなデバイスでフルスクリーンの画像を構築するとします。次に、UIActivityViewControllerを使用して、Instagramなどの通常の方法で投稿します。UIActivityViewControllerを使用して転記しますが、クロップは避けてください。

ユーザーが共有ボタンをクリックすると、それは、通常のiOSのシェアリング・ブツが表示されます

enter image description here

、あなたは(ユーザーはもちろんのInstagramのユーザーだと仮定した場合)のInstagramに投稿することができます。心配ない。

しかし、通常、画像はInstagramで切り取られます。上部と下部が少し失われます。

実際にはこれに対応するソリューションはありますか?

iPhoneで普通のPhotosアプリを開き、Instagramに「共有」してポストしてください... あなたは少し上と下の少しを失います

ユーザーは、この上のInstagramのアイコンをクリックし...実際には

enter image description here

私はその後、に、戻って、ユーザの好みを意識すると、作るための方法がありますイメージは適切なサイズ

は、画像の選択(様々なサイズ)UIActivityViewControllerへを渡すおそらくに方法はありますか?

これについては何が問題なのですか?それは基本的な失敗のようですか?

注 - 私は、iOS-share-thingyに行く前に自分自身に「どのようなサイズの画像を作成したいですか?」と尋ねることができます。

注 - アップル社のシェアシステムを使用せずに、アプリ内のInstagramを言うために「直接」投稿することは可能であることを認識しています。しかし、それは分かりません。タイピング誰を保存するには

は、ここではiOSのシェアシステムを起動するには、いくつかのクリーンなコードです...

@IBAction func userClickedOurShareButton() 
     { 
     let s:[AnyObject] = [buildImage()] 
     let ac = CleanerActivity(activityItems:s, applicationActivities:nil) 

     ac.popoverPresentationController?.sourceView = view 
     // needed so that iPads won't crash. sarcasm: thanks Apple 

     ac.excludedActivityTypes = [UIActivityType.assignToContact, 
      UIActivityType.saveToCameraRoll, 
      UIActivityType.addToReadingList, 
      UIActivityType.copyToPasteboard ] 

     // consider UIActivityTypeMessage also 

     if #available(iOS 9.0, *) { 
       ac.excludedActivityTypes?.append(UIActivityType.openInIBooks) 
      } else { 
       // Fallback on earlier versions 
      } 

     self.present(ac, animated:false, completion:nil) 
     } 


class CleanerActivity: UIActivityViewController { 

    func _shouldExcludeActivityType(_ activity: UIActivity) -> Bool { 
     let activityTypesToExclude = [ 
      "com.apple.reminders.RemindersEditorExtension", 
      "com.apple.mobilenotes.SharingExtension", 
      "com.google.Drive.ShareExtension", 
      "com.apple.mobileslideshow.StreamShareService" 
     ] 

     if let actType = activity.activityType { 
      if activityTypesToExclude.contains(actType.rawValue) { 
       return true 
      } 
      else if super.excludedActivityTypes != nil { 
       return super.excludedActivityTypes!.contains(actType) 
      } 
     } 
     return false 
    } 

答えて

2

免責事項:このソリューションは、あなたのアプリにハードコーディングするのInstagramの拡張識別子を含み、よく、またはアプリの審査を通じてそれを行うことはできず、将来的には中断する可能性があります。あなた自身の責任で試みてください!

Appleには、UIActivityItemProviderというメカニズムがあります。 UIActivityViewControllerに画像を渡す代わりに、itemForActivityTypeをオーバーライドするUIActivityItemProviderのサブクラスを渡して、ユーザーが選択したアクティビティタイプに基づいて適切な画像を返すことができます。

Appleには多くの一般的なアクティビティタイプの定数がありますが、Instagramはまだ含まれていません。アクティビティタイプの生の値がcom.burbn.instagram.shareextensionであるかどうかをチェックすることでInstagramを識別できます。 Instagramが拡張のIDを変更した場合、これは壊れます。

ここでInstagramのに異なる画像を提供していUIActivityItemProviderです:

class DynamicImageProvider: UIActivityItemProvider { 

    let instagramImage: UIImage 
    let defaultImage: UIImage 

    init(instagramImage: UIImage, defaultImage: UIImage) { 
     self.instagramImage = instagramImage 
     self.defaultImage = defaultImage 
     super.init(placeholderItem: defaultImage) 
    } 

    override func activityViewController(_ activityViewController: UIActivityViewController, 
             itemForActivityType activityType: UIActivityType) -> Any? { 
     if activityType.rawValue == "com.burbn.instagram.shareextension" { 
      return instagramImage 
     } 
     else { 
      return defaultImage 
     } 
    } 
} 

次に、あなたのIBActionの最初の2行に変更:

let imageProvider = DynamicImageProvider(instagramImage:buildInstagramImage(), defaultImage:buildImage()) 
let ac = CleanerActivity(activityItems:[imageProvider], applicationActivities:nil) 
+0

おっとを!ほら! – Fattie

+0

もう一度ありがとう。私はこれが私の必要なものであれば100%確信していませんが、あなたの知識は非常にまれで、私は恩恵を受けて感謝の言葉を送った、Toadster! – Fattie

+0

あなたはgithubに気の利いたレポを持っています:O – Fattie

関連する問題