• Как добавить ViewController в СollectionViewCell?

    doublench21
    @doublench21 Куратор тега Swift
    СollectionViewCell это View, а TableViewController это ViewController, как бы совсем разные вещи. Имейте чёткое представление об этом. Правильный вопрос: Могу ли я в СollectionViewCell добавить TableView или вообще говоря любой View? (Вы это спрашивали?)

    Ниже представлены ссылки на тему вопроса:
    https://ashfurrow.com/blog/putting-a-uicollectionv...
    https://medium.com/@adinugroho/fixed-height-uicoll...
    https://stackoverflow.com/questions/24126708/uicol...
    https://stackoverflow.com/questions/17398058/is-it...
    Ответ написан
    1 комментарий
  • Как реализовать такую анимацию оленя?

    profesor08
    @profesor08 Куратор тега CSS
    SVG + GSAP = твой олень с 404 странички. Ничего сложного нет, нужны только промежуточные состояния оленя, в данном случае три, смотрит влево, смотрит на тебя, смотрит вправо. А при помощи gsap анимируются все точки из одного состояния в другое.
    Ответ написан
    1 комментарий
  • С чего начать изучение парсинга на swift?

    doublench21
    @doublench21 Куратор тега Swift
    Вы хотите написать инструмент для парсинга или хотите научиться пользоваться инструментами для парсинга контента? Для первого Вам нужно разбираться хорошо, как уже писал человек выше, в dom, xpath и selectors. Если же вы хотите пользоваться инструментами, то углубляться в знания выше перечисленные не стоит. Тут нужно действовать по ситуации.

    Информация маленькая и добраться по дереву dom до него легко, тогда ваш случай это регулярки языка swift.

    Тк регулярный язык является подмножеством контекстно свободных языков и html является как раз одним из таких, регулярными выражениями не всегда удастся получить то что вы хотите. Для этих целей обычно используются готовые инструменты которые за вас разбирают dom. Вам лишь нужно указать селекторы и вы получите нужные данные. Гуглите, на swift такие библиотеки есть.

    Если информация которая Вам нужна подгружается динамически, то ответ от сервера содержать эти данные не будет, т.к. Js ещё не сработал, соответственно и инфа никакой нет. Для таких страниц нужно использовать веб-драйверы. Это некий браузер, которым вы управляете из кода. Гуглите Webdriver, Selenium, Chrome cli.
    Ответ написан
    3 комментария
  • Составили требований для верстальщика, не перегнули ли палку?

    @InoMono
    Покомпактнее надо бы.
    Никто не осилит прочитать столько.
    Меньше разделов.
    Ответ написан
    Комментировать
  • Как получить более 50 видео при помощи youtube api v3 используя язык swift?

    briahas
    @briahas
    ObjC, Swift, Python
    Я делал аплоад видео через гугл фреймворки
    pod 'GoogleAPIClientForREST'
        pod 'GoogleAPIClientForREST/YouTube'
        pod 'Google/SignIn'


    Сделай по аналогии только получение видео.
    в Бриджинг файле ОБЯЗАТЕЛЬНО прописать
    #import <Google/SignIn.h>
    #import <GTMSessionFetcher/GTMSessionFetcher.h>
    #import <GTMSessionFetcher/GTMSessionFetcherService.h>


    Разбивай и помещай код там где надо тебе
    let service =  GTLRYouTubeService()
    .....
            var configureError: NSError?
            GGLContext.sharedInstance().configureWithError(&configureError)
            assert(configureError == nil, "Error configuring Google services: \(configureError)")
    
            GIDSignIn.sharedInstance().delegate = self
            GIDSignIn.sharedInstance().uiDelegate = self
            GIDSignIn.sharedInstance().scopes = [kGTLRAuthScopeYouTube, kGTLRAuthScopeYouTubeUpload]
            GIDSignIn.sharedInstance().shouldFetchBasicProfile = true
            GIDSignIn.sharedInstance().signIn()
    
            service.authorizer = GIDSignIn.sharedInstance().currentUser.authentication.fetcherAuthorizer()
    let status = GTLRYouTube_VideoStatus()
            status.privacyStatus = kGTLRYouTube_VideoStatus_PrivacyStatus_Public
            
            let snippet = GTLRYouTube_VideoSnippet()
            snippet.title = "Lalala"
            snippet.descriptionProperty = "TestUpload"
            snippet.tags = "test,video,upload".components(separatedBy: ",")
            
            let youtubeVideo = GTLRYouTube_Video()
            youtubeVideo.snippet = snippet
            youtubeVideo.status = status
            
            let uploadParams = GTLRUploadParameters(fileURL: url, mimeType: "video/mp4")
            
            let uploadQuery = GTLRYouTubeQuery_VideosInsert.query(withObject: youtubeVideo, part: "snippet,status", uploadParameters: uploadParams)
            
            uploadQuery.executionParameters.uploadProgressBlock = {(progressTicket, totalBytesUploaded, totalBytesExpectedToUpload) in
                print("Uploaded", totalBytesUploaded)
            }
    
            service.executeQuery(uploadQuery) { (ticket, obj, error) in
                print(ticket)
                print(obj)
                print(error)
            }
    Ответ написан
    Комментировать
  • Почему не срабатывают события UITextField?

    doublench21
    @doublench21 Куратор тега Swift
    Это потому, что событие valueChanged не применимо к UITextField. Для этих целей существует UITextFieldDelegate. Или, если ты не знаешь что это такое, то просто посмотри внимательно, там есть такие события как Editing Changed/Did Begin/Did End(в том же списке, где ты и выбрал valueChanged).
    Ответ написан
    4 комментария
  • Как сделать, чтобы при вызове AlertController не затемнялся задний фон и объекты были кликабельны?

    doublench21
    @doublench21 Куратор тега Swift
    Наверное никак, да собственно это и есть самое верное поведение. Если Вам нужно кликать и не переносить акцент на всплывающее модальное окно, то вам лучше не использовать UIAlertController, а сделать своё модальное окно, с блекджеком и ... ну вы поняли

    Хотя модальное окно вам все равно не даст возможности кликать на элементы другого окна под ним. Если Вам нужно кликать, то лучшим вариантом будет анимированный UIView. Изначально он hidden, по какому-либо событию он появляется. UIView как ещё один элемент вашего окна.
    Ответ написан
    Комментировать
  • Почему не отображается CollectionVIew внутри ScrollView?

    doublench21
    @doublench21 Куратор тега Swift
    Ваш код? Цель? Тут нет Ванги.
    Ответ написан
    3 комментария
  • Как изменить кнопку return на клавиатуре?

    @iMaximus
    Никак, только если использовать кастомную клавиатуру.
    Вот все возможные значения для этой кнопки. Add там нет.
    public enum UIReturnKeyType : Int {
        case `default`
        case go
        case google
        case join
        case next
        case route
        case search
        case send
        case yahoo
        case done
        case emergencyCall
        @available(iOS 9.0, *)
        case `continue`
    }
    Ответ написан
    Комментировать
  • Как повторно использовать компоненты верстки в разных проектах?

    AlibekKulseitov
    @AlibekKulseitov
    Люблю верстать и писать музыку
    Чувак ты прям по адресу)) Я тоже таким болел и болею)) Вот как делаю я. Я создал для себя свои собственные компоненты которые наработал в ходе куча разных проектов. Когда надо их подключаю а когда не надо просто комментирую их. Выглядит это вот так:
    То есть в самой папке компонента я храню вьюшку компонента и его стили.

    5a3b8a0cb4cfc589655276.png
    <!-- breadcrumb -->
    <ul class="breadcrumb">
        <li class="breadcrumb__item">
            <a href="#" class="breadcrumb__link">Level 1</a>
        </li>
        <li class="breadcrumb__item">
            <a href="#" class="breadcrumb__link">Level 2</a>
        </li>
        <li class="breadcrumb__item">
            <a href="#" class="breadcrumb__link breadcrumb__link_is-active">Current page</a>
        </li>
    </ul>
    <!--/. breadcrumb -->

    //
    // Component: breadcrumb
    // --------------------------------------------------
    
    .breadcrumb {
        .nl();
        margin-bottom: 15px;
        margin-top: 40px;
        position: relative;
    
        &__item {
            display: inline-block;
            position: relative;
            margin-right: 5px;
    
            &:before {
                font-family: 'FontAwesome';
                font-size: 13px;
                color: #fff;
                content: '\f105';
                display: inline-block;
                vertical-align: middle;
                margin: 0 5px 0 0;
            }
    
            &:first-child:before {
                display: none
            }
        }
    
        &__link {
            font-size: 16px;
            color: #fff;
            text-decoration: none;
    
            &:hover,
            &:focus,
            &_is-active {
                color: @color-main;
            }
    
            @media(max-width: @screen-ms-max) {
                font-size: 14px;
            }
        }
    }


    В общем суть понятна да?)

    Что делать если начинаешь новый проект и все надо переносить?
    Ничего переносить не надо, у меня есть такая папка называется TARS BUILDER.
    Это получается Голый Tars только уже с моими компонентами и плагинами. Его походу дела и дополняю всегда.
    Например верстаю сижу и тут бац понял что тут можно удобно сделать так-то сяк-то, иду в папку Tars Builder и там же сразу делаю это улучшение. Короче говоря пока верстаю на поле боя я там понимаю как и что мне удобно и переношу эти апгрейды в свой фреймворк/шаблон TARS BUILED.

    Так же создаю походу дела свою миксины, переменные и тд.

    Таким способом я легко начинаю новый проект на TARS.
    Ответ написан
    Комментировать
  • Как можно приравнять TextField, точнее значение, введённое пользователем в него, в отдельную переменную?

    NSA-bot
    @NSA-bot
    Нужно привести переменную String, полученную из поля ввода к нужному Вам типу (Int, Double и т.п.)

    import UIKit
    
    class ViewController: UIViewController {
    
      // myDigit - переменная, куда запишем значение из поля
      var myDigit: Double = 0
    
      // Аутлет для текстового поля (чтобы достать введенное значение через метод .text)
      @IBOutlet weak var myTextField: UITextField!
    
      // Экшн для текстового поля, срабатывает по окончании ввода (нажатии Enter)
      @IBAction func textFieldEntered(_ sender: UITextField) {
        // Получение текста из поля, конвертирование его в Double и присвоение значения переменной
        myDigit = Double(myTextField.text!)!
        // Печататем в консоли значение переменной
        print("myDigit = \(myDigit)")
      }


    То есть, прямой ответ на Ваш вопрос, это строка кода:
    myDigit = Double(myTextField.text!)!
    Ответ написан
    4 комментария
  • Почему в программировании столько математики?

    PravdorubMSK
    @PravdorubMSK
    понимаешь, дорогой друг, есть два типа программистов - которые делают действительно что-то серьезное. их 0.1% от общего числа кодеров.

    а есть 99,9999% кодеров. у них ИНЫЕ задачи. у них задачи - собирать из кусков уже написанных высокоуровневых штук всякую муть ДЛЯ БИЗНЕСА. бизнесу редко нужна математика, бизнесу нужны всякие сайты и мобильные приложения.

    в рядовой вакансии какой-нибудь веб-макаки с зп средней по рынку математика действительно не нужна. вообще.

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

    всё.

    остальное - суть демагогия. за демагогию и за математику не платят. платят только за результат.
    Ответ написан
    7 комментариев
  • Для чего нужен AppDelegate?

    doublench21
    @doublench21 Куратор тега Swift
    Вообще говоря это некая точка входа в ваше приложение. Этот класс управляет состояниями вашего приложения. Он так же содержит главное окно вашего приложения, то бишь UIWindow. В этом классе настраиваются все основные потребности вашего приложения, будь то Push Notifications или Voice Calls и так далее. Я бы сказал это Core вашего приложения.

    Это можно понять по его наследованию. UIResponder и UIApplicationDelegate
    По первому:
    An abstract interface for responding to and handling events.

    По второму:
    A set of methods that are called by the singleton UIApplication object in response to important events in the lifetime of your app.

    То бишь чувствуете насколько тут важные(core) вещи вашего приложения.

    Но на начальном этапе изучения он вам практически не понадобится.
    Ответ написан
    3 комментария
  • Как сделать тень в uitextfield разную с двух сторон?

    doublench21
    @doublench21 Куратор тега Swift
    Достаточно просто. Нужно делать через свойство UIView.layer.shadowPath.
    import UIKit
    
    @IBDesignable
    class ViewController: UIViewController {
    
        @IBOutlet weak var textField: UITextField!
        
        override func viewDidLoad() {
            super.viewDidLoad()
    
            textField.layer.shadowColor = UIColor.purple.cgColor
            textField.layer.cornerRadius = 8
    
            textField.layer.masksToBounds = false
            textField.layer.shadowOffset = CGSize.zero
            textField.layer.shadowRadius = 3.0
            textField.layer.shadowOpacity = 0.7
    
            let path = UIBezierPath()
            path.move(to: CGPoint(x: 0.0, y: 0.0))
            path.addLine(to: CGPoint(x: textField.bounds.size.width/2, y: textField.bounds.size.height/2))
            path.addLine(to: CGPoint(x: textField.bounds.maxX, y: 0.0))
            path.addLine(to: CGPoint(x: textField.bounds.maxX, y: textField.bounds.maxY))
            path.addLine(to: CGPoint(x: 0.0, y: textField.bounds.maxY))
            path.close()
            textField.layer.shadowPath = path.cgPath
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }

    Вышло так:
    beVqPQ2jSguwZ8-Vva6S9w.jpg
    Путь использовал такой:
    VIBE4c0dTAuFQXiDfhoLPA.jpg
    Тебе остаётся для лучшего качества сделать скажем такой путь:
    WmsQS6asSLenTPqh9GKKRQ.jpg
    Или более извилистый путь, если ты хочешь уменьшить глубину тени слева и справа.
    Ответ написан
    Комментировать
  • Как сделать выезжающее из-под 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 комментариев
  • Кастомизация интерфейса в реальном времени?

    maximglobak
    @maximglobak
    iOS developer
    Есть хорошая статья про управление цветовыми схемами в приложении.
    medium.com
    Ну если в двух словах, то у тебя должна быть функция установки цветовой схемы и при любых изменениях ты должен ее вызывать. Так же эту функцию нужно вызывать в методе viewWillAppear.
    Ответ написан
    1 комментарий
  • Кто использует такой подход в написании CSS?

    IonDen
    @IonDen
    JavaScript developer. IonDen.com
    Совершенно нормальный подход. Пишу так же, пример:
    .footer {
        position: relative;
        background-color: @dark-grey-blue;
        color: @white;
        font-size: 12px;
        padding: 20px;
        box-sizing: border-box;
    
        @media @desktop {
            height: 200px;
            padding: 0;
        }
    
        &__text {
            display: block;
            text-align: center;
    
            @media @desktop {
                position: absolute;
                top: 75px;
                left: 15px;
                width: 250px;
                text-align: left;
            }
        }
    }
    Ответ написан
    Комментировать
  • Индексация Ajax сайта стоит ли что-то делать?

    Chvalov
    @Chvalov Автор вопроса
    Сделал так:
    Поставил https://github.com/prerender/prerender
    после чего отлавливаю всех поисковых ботов в Nginx по User Agent и отдаю им html страницу
    Ответ написан
    2 комментария
  • Как лучше сверстать такие блоки (blur)?

    kentuck1213
    @kentuck1213 Автор вопроса
    Короче нашел решение, и мне в этом помог canvas. Так что это возможно, но в данном примере очень геморно и требует полной переделки задних кругов, так что я оставил пока так.

    Пока взялся за другой блок который немного легче:
    PSD:
    5a0f25353fa44713856553.png
    Мой результат в браузере:
    5a0f25c30cc48754695661.png
    различие где-то 90 - 95%, что не так критично. Можно дотянуть и до 100, если потратить еще часик.

    code:
    <div class="work" style="background-image: url('assets/Moon.png'); width: 246px; height: 344px">
        <canvas width="246" height="344"/>
    </div>

    const canvas = document.querySelector('canvas'),
                ctx = canvas.getContext('2d');
            ctx.beginPath();
            ctx.filter = 'blur(11px)'; // тот самый blur
            let img = new Image;
            img.src = 'assets/Moon.png';
            img.onload = () => {
                ctx.drawImage(img, 0, 0, 246, 344); // вставляем картинку
    
    // имитируем работы box-shadow inset
                ctx.fillStyle = 'rgba(4, 4, 4, 0.33)'; 
                ctx.fillRect(0, 0, 246, 344);
    // конец иметации
    
    // достаем заблуренную картинку
                let new_img = ctx.getImageData(31, 85, 184, 234);
    // конец, достали и положили в переменную new_img
    
    // создаем новую прозрачную/пустую картинку - типо чистого png без изображения
                img = ctx.createImageData(246, 344);
                for (let i = img.data.length; --i >= 0;)
                    img.data[i] = 0;
                ctx.putImageData(img, 0, 0); // вставляем на весь холст (canvas)
    // конец очищения холста
    
                ctx.putImageData(new_img, 31, 85); // вставляем заблуренный кусок
            };

    Да, да, код жестко за хоркодин. Буду рад новыми и простыми способами, а пока тока так.
    Ответ написан
    8 комментариев