2015-12-15 3 views
-1

Мне нужно иметь кнопку общего доступа Facebook на одном из контроллеров представления моего приложения, чтобы при нажатии пользователем он поделился скриншотом текущего экрана пользователя с Facebook.Как поделиться скриншотом с Facebook с помощью Swift?

Я наблюдал несколько учебных пособий, таких, как эта о том, как реализовать кнопку Отправить на Facebook: https://www.youtube.com/watch?v=774_-cTjnVM

Но эти только показать, как я могу поделиться сообщение на Facebook, и я все еще немного путают, как разделить весь экран, с которым пользователь в настоящее время взаимодействует.

+1

Вы имеете в виду yo Вы хотите поделиться буквально тем, что видит пользователь, то есть скриншот? – TwoStraws

+0

Да, это именно то, что я хочу сделать. – NewbieWantsToMaster

ответ

8

Совместное использование непосредственно в Facebook не сложно. Во-первых, импорт Social рамки:

import Social 

Теперь добавьте это как действие вашей кнопки:

let screen = UIScreen.mainScreen() 

if let window = UIApplication.sharedApplication().keyWindow { 
    UIGraphicsBeginImageContextWithOptions(screen.bounds.size, false, 0); 
    window.drawViewHierarchyInRect(window.bounds, afterScreenUpdates: false) 
    let image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    let composeSheet = SLComposeViewController(forServiceType: SLServiceTypeFacebook) 
    composeSheet.setInitialText("Hello, Facebook!") 
    composeSheet.addImage(image) 

    presentViewController(composeSheet, animated: true, completion: nil) 
} 

Вы могли бы быть интересно узнать, что UIActivityViewController позволяет пользователям делиться на Facebook, но и другие услуги. Код выше для вашего точного вопроса: обмен на Facebook. Этот код отображает весь видимый экран; вы также можете сделать индивидуальные представления, если хотите.

Примечание. Как указывает Duncan C в комментарии ниже, этот код рендеринга не будет содержать ничего вне вашего приложения, например, других приложений или системных элементов управления.

+0

Лучший ответ, который я мог бы получить по этому вопросу! Большое спасибо TwoStraws. Пора идти и изучить рабочий код, который у меня есть, теперь :) – NewbieWantsToMaster

+1

Добро пожаловать! По крайней мере, я надеюсь, что я дал вам хорошие рекомендации для Google, если только 95% решает вашу проблему. Удачи! – TwoStraws

+0

Код заказа: этот код отобразит содержимое всего окна вашего приложения, но не все, что принадлежит другому приложению или системе. –

4

В iOS 8 и ранее раньше была частная структура, которую вы могли бы использовать для захвата всего экрана. Использование этой структуры приведет к тому, что ваше приложение будет отклонено для хранилища приложений, но, по крайней мере, оно сработало.

Начиная с прошивкой 9, что API больше не работает

Лучшее, что вы можете сделать, это захватить взгляды своего приложения. Это не будет включать строку состояния или другие вещи, нарисованные системой или другими приложениями.

Один из способов - создать контекст вне экрана, визуализировать родительский вид, который вы хотите захватить, в контекст вне контекста (возможно, используя drawViewHierarchyInRect:afterScreenUpdates:, загрузите данные из контекста в UIImage, а затем закройте контекст.

Другой способ представляет собой новый API, который будет захватывать снимок зрения иерархии. Одним из новых методов, чтобы захватить снимок является snapshotViewAfterScreenUpdates. это создает специализированный вид снимка.

+0

Большое спасибо Duncan, читающий ваши комментарии вместе с кодом TwoStraws, представляющим на эту тему, действительно полезно и проницательно, чтобы лучше понять ситуацию. Я очень ценю это. – NewbieWantsToMaster

1

скор 3

let screen = UIScreen.main 

    if let window = UIApplication.shared.keyWindow { 
     UIGraphicsBeginImageContextWithOptions(screen.bounds.size, false, 0); 
     window.drawHierarchy(in: window.bounds, afterScreenUpdates: false) 
     let image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     let composeSheet = SLComposeViewController(forServiceType: SLServiceTypeFacebook) 
     composeSheet?.setInitialText("Hello, Facebook!") 
     composeSheet?.add(image) 

     present(composeSheet!, animated: true, completion: nil) 
    }