В некоторых ситуациях пользователям iPhone или iPad может быть не удобно задействовать две руки, чтобы сделать скриншот экрана во время использования приложения, и они были бы счастливы делать это с помощью нажатия на одну кнопку - прямо в интерфейсе приложения.
На самом деле ни разу даже не возникало такой мысли - делать скриншот экрана iPhone с помощью одной кнопки в интерфейсе приложения, пока один товарищ не рассказал, что есть категория пользователей устройств Apple "старой закалки", которым не удобно растопыривать пальцы и задейстывовать две руки для сохранения изображения экрана.
1. В файле info.plist добавить ключ "Privacy - Photo Library Additions Usage Description" и указать в его значении, для чего приложению нужен доступ к фотогаллерее. Например, честно написать: "App XXX need to save screenshots to your gallery only" (Приложение ХХХ будет только созранять скриншоты в вашу галерею).
2. Добавить в нужный ViewController расширение для создание скриншота:
extension UIView {
func takeScreenshot() -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.bounds.size, false, UIScreen.main.scale)
drawHierarchy(in: self.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
if image != nil {
return image!
}
return UIImage()
}
}
3. Добавить в нужный ViewController кнопку:
@IBAction func makeScreenshot(_ sender: UIButton) {
var image:UIImage = UIImage()
let screenshot = self.view.takeScreenshot()
image = screenshot
// сохраняем скриншот в галерею:
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}
Для звукового уведомления пользователей, что скриншот был сделан можно добавить воспроизведение системного звука CameraShutter (звук затвора камеры), не смотря на то, что у iPhone и iPad затвор не механический в принципе.
1. Добавить импорт фреймворка AVFoundation:
import AVFoundation
2. Добавить внутрь кода @IBAction (нажатие кнопки для создания скриншота) в конец следующий код:
let systemSoundID: SystemSoundID = 1108
AudioServicesPlaySystemSound (systemSoundID)
Системный звук с кодом 1108 - это звук затвора фотокамеры (CameraShutter).
| SystemSoundID | File name | Category |
|---|---|---|
| 1000 | new-mail.caf | MailReceived |
| 1001 | mail-sent.caf | MailSent |
| 1002 | Voicemail.caf | VoicemailReceived |
| 1003 | ReceivedMessage.caf | SMSReceived |
| 1004 | SentMessage.caf | SMSSent |
| 1005 | alarm.caf | CalendarAlert |
| 1006 | low_power.caf | LowPower |
| 1007 | sms-received1.caf | SMSReceived_Alert |
| 1008 | sms-received2.caf | SMSReceived_Alert |
| 1009 | sms-received3.caf | SMSReceived_Alert |
| 1010 | sms-received4.caf | SMSReceived_Alert |
| 1011 | - | SMSReceived_Vibrate |
| 1012 | sms-received1.caf | SMSReceived_Alert |
| 1013 | sms-received5.caf | SMSReceived_Alert |
| 1014 | sms-received6.caf | SMSReceived_Alert |
| 1015 | Voicemail.caf | - |
| 1016 | tweet_sent.caf | SMSSent |
| 1020 | Anticipate.caf | SMSReceived_Alert |
| 1021 | Bloom.caf | SMSReceived_Alert |
| 1022 | Calypso.caf | SMSReceived_Alert |
| 1023 | Choo_Choo.caf | SMSReceived_Alert |
| 1024 | Descent.caf | SMSReceived_Alert |
| 1025 | Fanfare.caf | SMSReceived_Alert |
| 1026 | Ladder.caf | SMSReceived_Alert |
| 1027 | Minuet.caf | SMSReceived_Alert |
| 1028 | News_Flash.caf | SMSReceived_Alert |
| 1029 | Noir.caf | SMSReceived_Alert |
| 1030 | Sherwood_Forest.caf | SMSReceived_Alert |
| 1031 | Spell.caf | SMSReceived_Alert |
| 1032 | Suspense.caf | SMSReceived_Alert |
| 1033 | Telegraph.caf | SMSReceived_Alert |
| 1034 | Tiptoes.caf | SMSReceived_Alert |
| 1035 | Typewriters.caf | SMSReceived_Alert |
| 1036 | Update.caf | SMSReceived_Alert |
| 1050 | ussd.caf | USSDAlert |
| 1051 | SIMToolkitCallDropped.caf | SIMToolkitTone |
| 1052 | SIMToolkitGeneralBeep.caf | SIMToolkitTone |
| 1053 | SIMToolkitNegativeACK.caf | SIMToolkitTone |
| 1054 | SIMToolkitPositiveACK.caf | SIMToolkitTone |
| 1055 | SIMToolkitSMS.caf | SIMToolkitTone |
| 1057 | Tink.caf | PINKeyPressed |
| 1070 | ct-busy.caf | AudioToneBusy |
| 1071 | ct-congestion.caf | AudioToneCongestion |
| 1072 | ct-path-ack.caf | AudioTonePathAcknowledge |
| 1073 | ct-error.caf | AudioToneError |
| 1074 | ct-call-waiting.caf | AudioToneCallWaiting |
| 1075 | ct-keytone2.caf | AudioToneKey2 |
| 1100 | lock.caf | ScreenLocked |
| 1101 | unlock.caf | ScreenUnlocked |
| 1102 | - | FailedUnlock |
| 1103 | Tink.caf | KeyPressed |
| 1104 | Tock.caf | KeyPressed |
| 1105 | Tock.caf | KeyPressed |
| 1106 | beep-beep.caf | ConnectedToPower |
| 1107 | RingerChanged.caf | RingerSwitchIndication |
| 1108 | photoShutter.caf | CameraShutter |
| 1109 | shake.caf | ShakeToShuffle |
| 1110 | jbl_begin.caf | JBL_Begin |
| 1111 | jbl_confirm.caf | JBL_Confirm |
| 1112 | jbl_cancel.caf | JBL_Cancel |
| 1113 | begin_record.caf | BeginRecording |
| 1114 | end_record.caf | EndRecording |
| 1115 | jbl_ambiguous.caf | JBL_Ambiguous |
| 1116 | jbl_no_match.caf | JBL_NoMatch |
| 1117 | begin_video_record.caf | BeginVideoRecording |
| 1118 | end_video_record.caf | EndVideoRecording |
| 1150 | vc~invitation-accepted.caf | VCInvitationAccepted |
| 1151 | vc~ringing.caf | VCRinging |
| 1152 | vc~ended.caf | VCEnded |
| 1153 | ct-call-waiting.caf | VCCallWaiting |
| 1154 | vc~ringing.caf | VCCallUpgrade |
| 1200 | dtmf-0.caf | TouchTone |
| 1201 | dtmf-1.caf | TouchTone |
| 1202 | dtmf-2.caf | TouchTone |
| 1203 | dtmf-3.caf | TouchTone |
| 1204 | dtmf-4.caf | TouchTone |
| 1205 | dtmf-5.caf | TouchTone |
| 1206 | dtmf-6.caf | TouchTone |
| 1207 | dtmf-7.caf | TouchTone |
| 1208 | dtmf-8.caf | TouchTone |
| 1209 | dtmf-9.caf | TouchTone |
| 1210 | dtmf-star.caf | TouchTone |
| 1211 | dtmf-pound.caf | TouchTone |
| 1254 | long_low_short_high.caf | Headset_StartCall |
| 1255 | short_double_high.caf | Headset_Redial |
| 1256 | short_low_high.caf | Headset_AnswerCall |
| 1257 | short_double_low.caf | Headset_EndCall |
| 1258 | short_double_low.caf | Headset_CallWaitingActions |
| 1259 | middle_9_short_double_low.caf | Headset_TransitionEnd |
| 1300 | Voicemail.caf | SystemSoundPreview |
| 1301 | ReceivedMessage.caf | SystemSoundPreview |
| 1302 | new-mail.caf | SystemSoundPreview |
| 1303 | mail-sent.caf | SystemSoundPreview |
| 1304 | alarm.caf | SystemSoundPreview |
| 1305 | lock.caf | SystemSoundPreview |
| 1306 | Tock.caf | KeyPressClickPreview |
| 1307 | sms-received1.caf | SMSReceived_Selection |
| 1308 | sms-received2.caf | SMSReceived_Selection |
| 1309 | sms-received3.caf | SMSReceived_Selection |
| 1310 | sms-received4.caf | SMSReceived_Selection |
| 1311 | - | SMSReceived_Vibrate |
| 1312 | sms-received1.caf | SMSReceived_Selection |
| 1313 | sms-received5.caf | SMSReceived_Selection |
| 1314 | sms-received6.caf | SMSReceived_Selection |
| 1315 | Voicemail.caf | SystemSoundPreview |
| 1320 | Anticipate.caf | SMSReceived_Selection |
| 1321 | Bloom.caf | SMSReceived_Selection |
| 1322 | Calypso.caf | SMSReceived_Selection |
| 1323 | Choo_Choo.caf | SMSReceived_Selection |
| 1324 | Descent.caf | SMSReceived_Selection |
| 1325 | Fanfare.caf | SMSReceived_Selection |
| 1326 | Ladder.caf | SMSReceived_Selection |
| 1327 | Minuet.caf | SMSReceived_Selection |
| 1328 | News_Flash.caf | SMSReceived_Selection |
| 1329 | Noir.caf | SMSReceived_Selection |
| 1330 | Sherwood_Forest.caf | SMSReceived_Selection |
| 1331 | Spell.caf | SMSReceived_Selection |
| 1332 | Suspense.caf | SMSReceived_Selection |
| 1333 | Telegraph.caf | SMSReceived_Selection |
| 1334 | Tiptoes.caf | SMSReceived_Selection |
| 1335 | Typewriters.caf | SMSReceived_Selection |
| 1336 | Update.caf | SMSReceived_Selection |
| 1350 | - | RingerVibeChanged |
| 1351 | - | SilentVibeChanged |
| 4095 | - | Vibrate |
Jeppesen создал JDM (Jeppesen Distribution Manager) для iOS и объявил о стратегическом альянсе с компанией Bad Elf, которая выпустила портативный аксессуар для загрузки /выгрузки данных – Bad Ef Wombat. Устройство Wombat представляет собой беспроводную систему передачи данных, а программа JDM (iOS) позволяет скачать обновления навигационных баз данных Jeppesen в iPad или в iPhone для...
В дополнение к обычной сводке METAR и TAF многие военные аэродромы в метеорологической сводке могут использовать цветовой код, обозначенный словом на английском языке. Этот цветовой код является одной из форм сокращение для экипажей и дополнительно акцентирует внимание на основной информации в сообщении.
В одной из игр КВН - это был финал Высшей лиги КВН в 2003 году, выступала сборная Пятигорска со СТЭМом "Репка", и сюжет был следующим: некие жители России тянули репку, и у них это поначалу было не очень результативно, так как типа того с другой стороны планеты ту же самую рупку тянули американцы :))) Потом с помощью русской смекалки и из-за "шаблонного мышления американцев" наши герои, наконец-то...
Дискавери фаза (Discovery Phase) — процедура сбора информации, выполняемая с целью понимание отрасли, для которой разрабатывается продукт, бизнеса Вашего заказчика и целевой аудитории. Важно получить глубокое понимание ожиданий заказчика, лиц, принимающих решения с его стороны, а также конечных пользователей в отношении продукта. Основной целью предварительного анализа является предоставление технического предложения...
Ведущий: Ежедневно тысячи людей попадают в кpитические ситуации, безвыходные положения, ломают pуки и ноги. Помочь им в этом пpизвана наша пpогpамма и служба "Спасение 911". Приободрить людей, попавших в беду, свести все к шутке - в этом состоит наша главная задача. И об одном таком случае, случившемся в Рождество, я не имею пpава молчать. Да, собственно, не очень-то и хочется.
Высокий уровень лояльности компании Apple к своим клиентам подтверждается в том числе и возможностью отменить покупку платного приложения, подписки или контента. С точки зрения мобильного разработчика данная информация, по идее, должна быть спрятана от пользователей мобильных устройств, а процедура запроса возврата потраченных денег должна быть сильно усложнена, бюрократизирована и доведена до уровня...
... Разбиваются обычно долб#&бы. Вот сидят десять экипажей, водку пьют. Напились, и вот вдруг один начинает: - Да вот что вы, гражданские, вы летать не умеете. Вот мы военные - круто летаем, закрылки перед взлетом не выпускаем!