iOS. Когда объекты UIViewController требуются в разных ориентациях в одном приложении

Например, если все приложение в ориентации portrait, а при клике на графике «разворачивается» на весь экран в landscape.

Источник решения:

http://stackoverflow.com/questions/24970286/differnet-orientations-for-various-view-controllers/24970381#24970381

Возможно единственное универсальное решение — использовать афинные преобразования:

-(void)setRotationInLandscapeMode:(BOOL)status
{
if(status)
{
self.navigationController.navigationBar.frame = CGRectOffset(self.navigationController.navigationBar.frame, 0.0, -20.0);
self.view.transform = CGAffineTransformMakeRotation((M_PI * (90) / 180.0));
self.view.frame = CGRectMake(0,0, 320,568 );
}
else
{
self.view.transform = CGAffineTransformMakeRotation((0));
self.view.frame = CGRectMake(0,0, 320,568 );
}
}

Здесь приведено вместе с кодом, возвращающим view в исходное положение.
Далее вызываем этот код при отображении view:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
[self setRotationInLandscapeMode:YES];
}

В данном коде можно брать не конкретное значение прямоугольника, а из существующего view напрямую или вычислять на основе его.

На симуляторе не работает строка:

[[UIApplication sharedApplication] setStatusBarHidden:status];

Возможно, лишняя, или правильно отображаться будет только на устройстве. Или зависит от структуры проекта.

Также не работают supportedInterfaceOrientations и подобные методы. Внутри UIViewController они просто не работают. Внутри UINavigationController они работают, но только только один раз при его создании/отображении, т.е. можно задать ориентацию только для всех UIVIewControllers внутри него единоразово и нельзя выставлять какие-либо настройки для отдельного UIViewController.

iOS. Формат даты в зависимости от региональных настроек телефона

Иногда требуется, чтобы приложение показывало не просто дату в определенном формате, а дату в зависимости от выбранной в глобальных настройках страны/региона.

Решение есть:

http://stackoverflow.com/questions/7941789/format-date-and-time-after-device-current-region-settings

Позволяет избавиться например от проблемы выбора того, что писать сначала число, потом месяц или наоборот

Gamemaker Studio. Использование нового отладчика

В Studio 1.3 появился компиллятор с breakpoints.yoyo degugger

Будет полезным при отладке сложных алгоритмов. Горячие клавиши — F5 продолжить, F9 установить breakpoint, F10, F11 — пошаговая отладка. Есть окошко слежения за переменными проекта.

В настоящее время все еще сырой. Например, установленную точку breakpoint очень сложно убрать.

Новое в iOS 7/7.1

ios 7

Эта статья является переводом раздела официальной документации apple. Источники:

https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS7.html

https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS7_1.html#//apple_ref/doc/uid/TP40013916-SW1

Из нововведений стоит отметить следующее:

- расширенная поддержка внешних устройств;

- тайлы карт Apple теперь можно изменять;

- поддержка 64-разрядной архитектуры и т.д.

Читать далее

C++. Использование *.dll без вспомогательных файлов.

visual studio 2013
Пример здесь:

http://goffconcepts.com/techarticles/calldll.html

В Visual Studio создаем проект c++ dll, компилируем. В проекте, в котором планируется использовать библиотеку: через контекстное меню добавляем ссылку на dll, добавляем часть кода по ссылке выше.

При необходимости можно в открытое «решение» (solution) добавить новый пустой проект и в нем создать main функцию. Это может потребоваться при отладке dll.

Gamemaker Studio. Использование внешних библиотек dll.

Тема с ответами на вопрос на официальном форуме:

http://gmc.yoyogames.com/index.php?showtopic=614647

Наиболее полное руководство:

http://gmc.yoyogames.com/index.php?showtopic=405812

Создать пустой C++ проект, добавить main.cpp, собрать библиотеку. Пример содержания main.cpp:


#include
#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT double Multiply(double a, double b) {
return a * b;
}

DLLEXPORT double MsgBox(char* caption, char* message) {
MessageBox(0, message, caption, MB_OK);
return 0;
}

DLLEXPORT double ProcCount() {
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
return sysinfo.dwNumberOfProcessors;
}

Сгенерированную таким образом библиотеку нужно перетянуть в окно Gamemaker Studio в папку Included Files.

Более того, можно в Visual Studio настроить экспорт скомпилированных файлов в папку для included. Тогда новые измененная библиотека будет подхватываться автоматически.

Не удалось настроить проект для тестирования библиотеки в Visual Studio. Ругается на объявления char *. При этом GM: Studio воспринимает эту библиотеку нормально.

SmartGit+GitHub. Инструкция

smartgit
Ссылка на первоисточник:

http://derekreynolds.wordpress.com/2011/01/18/how-to-set-up-smartgit-with-github/

Коротко по пунктам:
- установить и запустить git (для windows есть standalone инсталлятор)
- через меню «Программы» найти установленный Git GUI сгенерировать SSH ключ и подключить к аакаунту
- установить SmartGit и забрать нужный проект с GitHub.

ВАЖНО! Вводить нужно не тот адрес, который предлагает GitHub, а адрес вида:
git@github.com:myn/warm-z-twopointtwo-base.git

где «git@github.com:» — общая часть для всех проектов на github.com, дальше идет относительный адрес репозитория.

Либо можно переключить внешний вид адреса в GitHub справа страницы (через ссылки во фразе «You can clone with HTTPS, SSH, or Subversion. «).

Стандартная http авторизация (с примерами)

На сервере авторизацию обычно реализуют своим способом — определяют свои параметры, передаваемые в запросе.
Существуюет другой, более общий способ — через установки значения заголовка «Authorization». Примеры:

C#:

HttpWebRequest webRequest = ...;
webRequest.Credentials = new NetworkCredential(User, Password);

GameMaker Studio (GML):

var auth_base64 = "Basic " + base64_encode(username + ":" + password);
var headers = ds_map_create();
ds_map_add(headers, "Host", host);
ds_map_add(headers, "Authorization", auth_base64);
ds_map_add(headers, "Content-Type", "application/json-rpc");
ah_auth = http_request(protocol + "://" + host + target, 'POST', headers, body);
ds_map_destroy(headers);

Objective-C:

NSString *auth_base = ...; //получение аналогично способу для GML
NSMutableURLRequest *request = ...;
[request setValue:auth_base forHTTPHeaderField:@"Authorization"];

В Objective-C также есть класс NSURLCredential. Не проверен, единственный найденный способ с его использованием — через NSURLConnectionDelegate.

HMAC SHA512 на Objective C

HMAC SHA512 — разновидность шифрования. Не путать с SHA512 hash (подвид семейства SHA2) — алгоритмом хеширования, который используется в таком шифровании.

Код на Objective C:


- (NSString *) sha512:(NSString *) input withSalt: (NSString *) salt {

const char *cKey = [salt cStringUsingEncoding:NSUTF8StringEncoding];
const char *data = [input cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char digest[CC_SHA512_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA512, cKey, strlen(cKey), data, strlen(data), digest);

NSString *hash;

NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];

for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
hash = output;
return hash;
}

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

Источники:

http://stackoverflow.com/questions/18859005/sha215-with-salt-for-ios

http://ru.wikipedia.org/wiki/HMAC

Консольное приложение Mac OS игнорирует performSelector:?

Обычно iOS и Mac OS приложения создают цикл обработки сообщений. При создании консольного приложения кода для запуска такого цикла не генерируется. Примерный вариант решения проблемы — изменить функцию main:


{
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
//какие-то действия
...
while ([runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
}

Возможно, это не совсем правильный/неполный код, потому что потребовалось в коде с ARC приложения-бота, для которого наиболее критичный параметр — скорость разработки.