В некоторых ситуациях пользователям 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 |
Ситуация: вы подключили свой iPad или iPhone к компьютеру с помощью кабеля. Программа iTunes запустилась сама, или вы ее принудительно запустили, но функция синхронизации приложений (программ) не активна! :( Выражается это в невозможности установить/убрать галочку на Синхронизации приложений - вся станица "Программы" выглядит не активной.
Чтобы работать с очередями IBM MQ с помощью PHP, необходимо установить библиотеку для PHP - mqseries. В настоящее время самая актуальная библиотека mqseries имеет версию 0.15.0 (beta) от 14 июля 2017. Предварительно необходимо установить IBM WebSphereMQ. Исходные данные: - виртуальный сервер с установленной операционной системой Linux Debian 10 x64; - панель управления сервером ISP Manager Lite 5. - нативная...
Во-первых, зачем это может понадобиться? Представьте ситуацию: корпоративные сайт со специфическими задачами, количество пользователей - до нескольких сотен человек. Регистрацию этих пользователей выполняет администратор сайта, самостоятельная регистрация на сайте специально отключена, чтобы отсечь чужих. Для того, чтобы администратору не нужно было создавать множество почтовых ящиков, на...
Сегодня ночью (по Московскому времени, когда в американском Денвере в это время был солнечный день) фирма Jeppesen представила на всеобщее обозрение видеоролик с анонсом новой версии программы Jeppesen Mobile FliteDeck - v2. К сожалению пока не раскрывается дата, когда можно будет вживую протестировать эту программу. Действующая версия программы Jeppesen Mobile FliteDeck, существующая с прошлого года на данный...
PHPMyAdmin - это веб-интерфейс для администрирования СУБД MySQL, который позволяет через браузер администрировать ваши БД, запускать различные команды SQL, просматривать содержимое таблиц и баз данных, редактировать их и создавать новые. Многие web-разработчики пользуются PHPMyAdmin, соответственно, многие хостеры обязательно включают PHPMyAdmin в сборку при установке сервера. PHPMyAdmin имеет...
В некоторых ситуациях пользователям iPhone или iPad может быть не удобно задействовать две руки, чтобы сделать скриншот экрана во время использования приложения, и они были бы счастливы делать это с помощью нажатия на одну кнопку - прямо в интерфейсе приложения. На самом деле ни разу даже не возникало такой мысли - делать скриншот экрана iPhone с помощью одной кнопки в интерфейсе приложения,...
Все автомобильные GPS-навигаторы имеют меню с достаточного размера кнопками на сенсорном экране для выстрого запуска необходимых приложений, в первую очередь - программы для непосредственной навигации. Многие современные навигаторы имеют возможность менять путь к навигационной программе. Поэтому при установке альтернативного ПО есть возможность безболезненно через настройки меню задать временно или...