четверг, 15 октября 2015 г.

Font names in iOS

Might be interesting for you as Quick Win within the Debugger:
(lldb) po [UIFont fontNamesForFamilyName:@"Helvetica Neue"]

(id) $1 = 0x079d8670 <__NSCFArray 0x79d8670>(
HelveticaNeue-Bold,
HelveticaNeue-CondensedBlack,
HelveticaNeue-Medium,
HelveticaNeue,
HelveticaNeue-Light,
HelveticaNeue-CondensedBold,
HelveticaNeue-LightItalic,
HelveticaNeue-UltraLightItalic,
HelveticaNeue-UltraLight,
HelveticaNeue-BoldItalic,
HelveticaNeue-Italic
)
source: http://stackoverflow.com/questions/11083954/uifont-fontwithname-font-name

вторник, 13 октября 2015 г.

Pull to refresh swift


var refresher: UIRefreshControl!

    override func viewDidLoad() {
        super.viewDidLoad()
//...
        initRefresher()
    }
    
    // MARK: Helper
    func initRefresher() {
        refresher = UIRefreshControl()
        refresher.attributedTitle = NSAttributedString(string: "Потяните вниз для обновления")
        refresher.addTarget(self, action: "refreshData", forControlEvents: UIControlEvents.ValueChanged)
        tableView.addSubview(refresher)
        

    }


    
    func refreshData() {
//... обновляемся
    refresher.endRefreshing() //выключаем обновление
    }

Хорошая статья: pull to refresh

Core Data NSPredicate checking for BOOL value

Based on Apple Document Here, we can use the following two methods to compare Boolean:
NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@",[NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];
However, the above predicate cannot get out the ones with empty anAttribute. To deal with an empty attribute, you need the following method according to Apple document here:
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"]; // it's in the document
or
predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here

Corner Radius

import QuartzCore
...
view.layer.cornerRadius = 5;
view.layer.masksToBounds = YES;

пятница, 25 сентября 2015 г.

вторник, 22 сентября 2015 г.

Решение проблемы с HTTP в iOS 9

Если при попытке доступа к ресурсам в сети Интернет вы получаете получаете ошибку вида:
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. "
Значит, Вы один из тех страдальцев, кто по каким-то причинам не знает, что Apple озаботилась нашей с вами безопасностью)))).
Теперь по умолчанию запрещено использовать HTTP протокол в качестве транспорта. Разрешено HTTPS. Для тех кто не знает что такое HTTP/HTTPS вики/гугл/яндекс и т.п. в помощь.
Маленькое отступление.
В теории это наверное хорошо. Наверное, потому что, не все алгоритмы шифрования используемые в слое представлений транспорта HTTPS коллизионно устойчивы.  Так алгоритм md5 несколько года назад считался абсолютно надежным и теоретически коллизионно устойчивым, теперь же им не стоит шифровать даже список покупок в магазине. А еще вылезают такие вещи как Heartrbleed, или скандал с Ubuntu, под которой несколько лет генерились идентичные сертификаты на разных серверах и т.д. и т.п. В общем идею вы поняли... Но у этой  проблемы есть не только абстрактная но и практическая часть. Заключается она вот в чем: сертификаты для https стоят денег. Чаще всего от 100 до 300 долларов в год. Сразу удорожает хостинг, т.к. при использовании HTTPS вы шифруете заголовки и и веб сервер не знает к какому dns имени вы идете. В результате на 1 ip адрес приходится 1 https сайт. (Да я знаю, что Microsoft научила IIS заглядывать в заголовки HTTPS сообщений, и даже объясняет что это безопасно))). Но задайте себе вопрос сколько веб серверов работает на MS Windows Server/IIS и чтобы "2 раза не вставать" подумайте почему.)
И не то что бы сложно в настройке но требует от инженера дополнительных телодвижений и отвлекает его от WoW/WoT/Dota/(подставьте сами). Создает дополнительную головную боль при высоких нагрузках и балансировке. (Дадада. Знаю Cisco. А цену вы знаете?) Адреса IPv4 давно закончились. На IPv6 мир перейдет лет через 10. Может раньше. Но не в 2016 году.
В общем и в частностях HTTPS это безопасно(пока), но дорого и для мелких ресурсов и для крупных.
ИМХО перфекционизм Apple лучше направить на контроль качества своей продукции и ПО. Т.к. при покупке нового iphone 6 plus в аппсторе я получил кирпич и 2 недели ждал пока его заменят по гарантии. При покупке mb pro 13 в аппсторе я получил не работающее зарядное устройство. Но т.к. Apple нас..ть на мое мнение, то приступим к  решению проблемы:
Добавляем в Info.plist :
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>YOURSITE.COM</key>
<dict>
<key>NSIncludeSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>

</dict>

Естественно YOURSITE.COM нужно заменить на url искомого сайта.

четверг, 17 сентября 2015 г.

Как конвертировать Адрес в Координаты в iOS


let address += "ул. Ленина, 4,Омск, Россия"
let geocoder = CLGeocoder()
geocoder.geocodeAddressString(address, completionHandler: {(placemarks: [AnyObject]!, error: NSError!) -> Void in
    if let err = error { println(err.localizedDescription) }
    if DEBUG { println(address) }
    if let placemark = placemarks?[0] as? CLPlacemark {
       let latitude: CLLocationDegrees = placemark.location.coordinate.latitude
       let longitude: CLLocationDegrees = placemark.location.coordinate.longitude
    }
})
Решение из : stackoverflow.com