• Как взаимодействовать с UIView, который является subview UIScrollView?

    doublench21
    @doublench21 Куратор тега Swift
    Попробуй:
    var panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(move))
    panRecognizer.minimumNumberOfTouches = 1
    panRecognizer.maximumNumberOfTouches = 1
    panRecognizer.delegate = self
    yourView.addGestureRecognizer(panRecognizer)
    
    @objc func move(_ sender: Any) {
        if (sender as? UIPanGestureRecognizer)?.state == .changed {
                // This will return you location in view
            let currentPoint: CGPoint = sender.location(in: view)
                // This will return you location in Scrollview
            let scrollPoint: CGPoint = sender.location(in: sender.view.superview)
        }
    }
    Ответ написан
    9 комментариев
  • Как два UIScrollView сделать зависимыми между собой?

    doublench21
    @doublench21 Куратор тега Swift
    Попробуй так:
    class MultiScrollViewController: UIViewController {
        // ...
    
        override func viewDidLoad() { 
            super.viewDidLoad()
    
            firstView.delegate = self
            secondView.delegate = self
        }
    
        // ...
    }
    
    extension MultiScrollViewController: UIScrollViewDelegate {
        func scrollViewDidScroll(scrollView: UIScrollView) {
            firstView.contentOffset = scrollView.contentOffset
            secondView.contentOffset = scrollView.contentOffset
        }
    }
    Ответ написан
    4 комментария
  • Как рассчитать объемы серверных мощностей для социальной сети?

    @InoMono
    Вот как раз что именно для успешной соц. сети и смысла нет сразу.
    Имеет смысл докупать мощности по мере роста сети.

    Ибо разница очень и очень велика на начальном этапе и то что будет через год-два. Ну это если проект "взлетит" конечно. Это я в предположении, что инвесторов не интересует невзлетающие проекты. Значит, рассчитываем на то, что н взлетит.

    Кроме того, если вы разработчики - то вам самим следует это знать.

    Если вы способны создать крайне эффективный проект, то:

    StackOverflow буквально несколько лет назад уже был известным и раскрученным на весь мир проектом. Наверное самым известным среди проектов подобного рода. И все миллионы пользователей, которые активно пишет на нем и активно читают - обслуживало всего навсего 2 сервера, под фронтенд и СУБД (не считая резервных/репликационных, само собой). Это были сервера на неплохом железе, но не дорогие. Поищите в сети, есть подробности.

    Вдумайтесь, весь мир, миллионы посетителей, активные пользователи, нагружающие СУБД операции поиска и записи. И всего пара серверов.

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

    ---------

    Оцените масштаб и необходимая скорость реагирования на рост.

    1. Если вы прям серьезно хотите, то вам в микросервисную архитектуру (Kubernetes вам в помощь) и в облака.
    2. Однако я полагаю, что первые пару лет посетителей не будет много. Поэтому начать можно вполне себе с VDS просто переключая тариф на постарше и постарше. Это копейки. Единственно, что я сразу бы вынес картинки/видео в облака, это очень удобно и не заботишься ни о месте на диске не о конфигурировании ПО. Использовать для этого специализированные сервисы: Openstack Swift (много хостеров), Google Storage, AWS S3 и т.п. При вынесении подобной тяжелой вещи с сервера - движок будет совершенно не требовательным.

    ---------

    Вам тут в соседнем посте правильно ответили:

    Стоимость разработки и раскрутки этой хрени огромна на фоне стоимости серверов.
    Сервера - копейки стоят.

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

    А так то расходы на команду в неделю могут быть больше чем за все сервера за год.
    В течение первых лет пяти раскрутки.

    И только по мере стабилизации сети, меньших объемов работ, но большей масштабности серверов - стоимость серверов будет превышать стоимость услуг людей.

    ---------

    Если бы я начал этот проект сам:
    то заложил бы на первый год сумму 6000 рублей в месяц на два сервера (основной и репликацию, движок и БД на одной машине, картинки/видео на отдельном облачном сервисе). Причем это VDS, а не выделенный сервер.
    На второй год 40 000 рублей в месяц (два кластера по 3 сервера в каждом).
    Начиная с третьего года ушел бы в облака.
    Там, полагаю, ценник был бы на уровне 30 000 - 60 000 рублей в месяц первое время.
    С четвертого года рассчитывал бы на 90 000 - 180 000 расходов в месяц.
    После этого начал бы подумывать, не уйти ли с облаков на свою инфраструктуру.

    Но это про мою гипотетическую архитектуру.
    Возможно у вас другая цель и другая архитектура.

    ---------------

    Как считать:

    Прикидываем количество пользователей.
    Прикидываем объемы генерируемого ими контента (причем это и фото и видео и сообщения и технические логи тоже не забыть, их немало)
    Умножаем на 3 (в серьезных системах нужно двойное реплицирование: оригинал и 2 копии)
    И добавляем еще 1 копию под разработку и "ранний доступ к бете", сплит-тестирование и пр.
    Дальше тут уже зависит от вашей архитектуры. Как я уже писал микросервисная архитектура хороша для взрывного роста, но довольно требовательна при небольшой нагрузе. Если вы прям не на 100% уверены в взрывном росте - лучше от нее отказаться, она и в разработке и в поддержке геморнее. Но зато масштабируется классно, это у нее не отнять.
    Дальше, если это будет на весь мир - нужно подумать насчет пары-тройки кластеров разной географии.

    -----------------

    Если у вас нет информации об количестве пользователей и объемах генерируемого ими контента - говорить тут конкретику невозможно.
    Ответ написан
    Комментировать
  • Актуальность swift?

    @iMaximus
    На вашем месте я изучал бы swift, да полно еще библиотек которые на obj c но их подключил и забыл, дальше все равно пишешь на swift. Есть еще работодатели которые до сих пор поддерживают проекты на obj c и их не мало, да и в целом знание obj c помогает. Но если ставить вопрос так, как его ставите вы, то однозначно swift. Работодатели смотрят отлично, на рынке нехватка swift программистов, многие уже пишут только на нем, например Тинькофф.
    Ответ написан
    1 комментарий
  • Как обработать JSON данные полученные с помощью Alamofire в Swift4?

    doublench21
    @doublench21 Куратор тега Swift
    Вот странные люди сюда забегают. Ты вообще пытался привести твой кусок JSON в человека-подобный вид, что бы в первую очередь самому увидеть, какая у тебя там структура. Вот ты пишешь guard let email = json["email"].string else, но если бы ты внимательно смотрел на свой JSON, то увидел бы:
    5a58a5d5b1573858264360.jpeg, что у тебя идёт массив, а лишь в нём ты работаешь с самим объектом, у которого ты и вытаскиваешь "email".

    for (index,subJson) in json {
        print(subJson["email"].string)
    }
    Ответ написан
    2 комментария
  • Как получить корректно работающий indexOf после удаления префикса из Data?

    doublench21
    @doublench21 Куратор тега Swift
    В описании метода index(of: )
    Discussion
    Attempting to remove more elements than exist in the collection triggers a runtime error.

    Calling this method may invalidate all saved indices of this collection. Do not rely on a previously stored index value after altering a collection with any operation that can change its length.


    А как этого избежать? Используя эти методы, никак. Используйте скажем filter:
    import Foundation
    
    var data = Data([0, 1, 2, 3, 4, 5])
    var newData = data.filter{$0 < 5}
    print(newData.index(of: 5) ?? "Ooops") // Ooops


    Вообще избегайте всех метод, которые уменьшают длину массива в Data.
    Ответ написан
  • Как бы сделать такие рамки?

    doublench21
    @doublench21 Автор вопроса, куратор тега Swift
    Спасибо за новодку Дмирий Голованов , но сделал несколько иначе. Но с маской решается проблема с добавлением тени по контору рамки. Без тени вышло так:
    RLe37oq.jpg

    Решение проблемы с тенью: https://stackoverflow.com/questions/25738296/parti...
    Ответ написан
    1 комментарий
  • Как сделать выезжающее из-под uitextfield оповещение?

    doublench21
    @doublench21 Куратор тега Swift
    Ну наверно как-то так, хотя за правильность я не ручаюсь.
    import UIKit
    
    class ViewController: UIViewController {
        @IBOutlet weak var textField: UITextField!
        private var substrateView = UIView()
        private var substrateLabel = UILabel()
        private var constraint = NSLayoutConstraint()
    
        @IBAction func someAction(_ sender: Any) {
            substrateView.isHidden = false
            UIView.animate(withDuration: 0.3) { [unowned self] in
                self.constraint.isActive = false
                self.constraint = self.substrateView.heightAnchor.constraint(equalToConstant: 60)
                self.constraint.isActive = true
                self.view.layoutIfNeeded()
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            textField.layer.borderWidth = 3
            textField.layer.borderColor = UIColor(red: 233/255, green: 128/255, blue: 129/255, alpha: 1).cgColor
            textField.layer.cornerRadius = 8
    
            substrateView.backgroundColor = UIColor(red: 233/255, green: 128/255, blue: 129/255, alpha: 1)
            substrateView.layer.cornerRadius = 8
    
            substrateLabel.text = "Login is not valid"
            substrateLabel.textAlignment = .center
            substrateLabel.textColor = UIColor.white
            substrateLabel.backgroundColor = UIColor.clear
    
            substrateView.addSubview(substrateLabel)
    
            substrateLabel.translatesAutoresizingMaskIntoConstraints = false
            substrateLabel.frame = CGRect.zero
            substrateLabel.sizeToFit()
            substrateLabel.bottomAnchor.constraint(equalTo: substrateView.bottomAnchor).isActive = true
            substrateLabel.centerXAnchor.constraint(equalTo: substrateView.centerXAnchor).isActive = true
    
            view.addSubview(substrateView)
    
            substrateView.translatesAutoresizingMaskIntoConstraints = false
            substrateView.topAnchor.constraint(equalTo: textField.topAnchor).isActive = true
            substrateView.leftAnchor.constraint(equalTo: textField.leftAnchor).isActive = true
            substrateView.rightAnchor.constraint(equalTo: textField.rightAnchor).isActive = true
            substrateView.widthAnchor.constraint(equalTo:textField.widthAnchor).isActive = true
    
            constraint = substrateView.heightAnchor.constraint(equalTo: textField.heightAnchor)
            constraint.isActive = true
    
            textField.layer.zPosition = 1
            substrateView.isHidden = true
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
    
    }


    Вышло как-то так:
    giphy.gif
    Конечно сам action выберешь такой какой тебе нужен. На гифке - вызывается просто по нажатию.
    Ответ написан
    5 комментариев
  • Что выбрать? 13/2017 или 15/2014?

    fedorez
    @fedorez
    Хатуль мадан
    128 мало, тем более что больше не расширить с помощью слота карточек.
    Ответ написан
    Комментировать
  • Публикация приложения в AppStore?

    @WayMax
    Можно написать приложение. По вашим словам приложения у вас нет. А то что вы хотите опубликовать - приложением не является.
    Ответ написан
    1 комментарий