• Как сделать тень в 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
    Или более извилистый путь, если ты хочешь уменьшить глубину тени слева и справа.
    Ответ написан
    Комментировать
  • Почему не происходит transition у UISearchController`а?

    doublench21
    @doublench21 Автор вопроса, куратор тега Swift
    Вообщем, разобрался. Это никакой ни UISearchController, а обычный UISearchBar c кастомным аниматором UIViewPropertyAnimator.
    Ответ написан
    2 комментария
  • Как сделать collectionView в tableView?

    doublench21
    @doublench21 Куратор тега Swift
    Не понял Вас. Ну есть у вас tableviewcell.xib и сопутствующий ему условный UITableViewCell.swift. В нём находится UICollectionView. Теперь делаете IBOutlet UICollectionView в файле UITableViewCell.swift. Ну и есть у вас также collectionviewcell.xib и сопутствующий ему условный UICollectionViewCell.swift. И допустим один контроллер UIViewController.swift. У вас очевидно есть доступ и к UITableView и UICollectionView. Теперь достаточно в этом контроллере указать его самого в качестве делегата для обеих коллекций. Вот и всё.

    UITableView есть уже как IBOutlet в вашем контроллере.
    А IBOutlet UICollectionView есть в классе UITableViewCell.

    Поправьте, если что не понял.
    Ответ написан
    1 комментарий
  • Как можно определить кнопку в SWIFT3?

    doublench21
    @doublench21 Куратор тега Swift
    Для этого в методе
    @IBAction func buttonPressed(_ sender: UIButton) { ... }
    есть аргумент sender по которому Вы и можете различать какая именно кнопка вызвала этот action. А вообще бы лучше основную свою задачу описали, а то так не очень понятно что Вы хотите. Зачем Вам findById( findByClass ) ? Для этого есть IBOutlets. Если Вы ищите кнопку среди subviews, то тут можно приводить каждый subview к типу UIButton(если это возможно) и смотреть скажем его title или смотреть его RestorationID.
    Ответ написан
    Комментировать
  • Односвязный список swift, почему ошибка?

    maximglobak
    @maximglobak
    iOS developer
    1) .next не всегда обязан быть
    например для элемента (iData: 22, dData: 2.99) у тебя нет .next, но в классе говорится, что он всегда есть.
    Отсюда следует, что .next - опциональный тип
    2) Тоже самое с .first в списке, он может быть или не быть. Вдруг ты все удалил и тогда будет краш.
    3) Ошибка как раз и возникала из-за того, что пыталась взять .next, которого нет
    Ниже исправил код с комментариями.
    class Link {
      private let iData: Int
      private let dData: Double
      public var next: Link?
    
      public init(iData: Int, dData: Double) {
        self.iData = iData
        self.dData = dData
      }
    
      public func displayLink() {
        print("{\(iData), \(dData)}")
      }
    }
    
    class LinkList {
    
      private var first: Link?
    
      public func isEmpty() -> Bool {
        return first == nil
      }
    
      // INSERT
      public func insertFirst(iData: Int, dData: Double) {
        let newLink = Link(iData: iData, dData: dData)
        newLink.next = first
        first = newLink
      }
    
      // DELETE
      public func deleteFirst() -> Link? {
        // Проверяем есть ли первый элемент, иначе удалить ничего нельзя и мы возращаем nil
        guard let first = first else { return nil }
        // Если есть первый элемент, то ему присваиваем значение второго
        // Если второго нет, то ему присвоится значение nil
        // А это значит мы удалили все элементы в списке
        self.first = first.next
        return self.first
      }
    
      //Display
      public func displayList() {
        print("List (first --> last)")
        // Создаем стартовый элемент, который изначально равен первому
        // Это опциональный тип и может быть nil, так как первый элемент тоже может быть nil
        // Если вдруг мы все удалили
        var element = first
        // Потом сразу делаем проверку на nil
        // Если элемента нет, то и выводить ничего не будем
        while element != nil {
          element?.displayLink()
          element = element?.next
        }
        print("----------")
      }
    
    }
    
    
    let theList = LinkList()
    theList.insertFirst(iData: 22, dData: 2.99)
    theList.insertFirst(iData: 55, dData: 5.99)
    theList.insertFirst(iData: 77, dData: 7.99)
    
    //theList.deleteFirst()
    //theList.deleteFirst()
    //theList.deleteFirst()
    
    theList.displayList()
    Ответ написан
    1 комментарий
  • Как добавить Collection View после конца прокрутки Table View?

    maximglobak
    @maximglobak
    iOS developer
    Заверни коллекцию вью в ячейку и добавь или в футер таблицы, или в футер секции, или в последнюю ячейку.
    Для этого смотри как делать кастомные ячейки и таблицы с несколькими типами ячеек.
    Ответ написан
    7 комментариев
  • Сколько это много ViewController?

    @freeg0r
    .. some dude ..
    Нет такого, это может быть и очень много, а может и один VC на всё приложение. Всё зависит от архитектуры, подхода и ТЗ, делать какие то общие VC для разных задач - усложнять код. Делать разные VC под похожие экраны, тоже не комильфо, надо выбирать баланс. Кроме того на одном экране может быть несколько VC. Я бы сказал, что оценивать приемлемость по количеству VC странно и не профессионально. Нужно смотреть на повторяемость одинакового кода тогда уж.
    Ответ написан
    Комментировать
  • Как можно задать двум различным UITabBar различные размеры?

    @Statusgman
    iOS developer
    appearance проксирует параметры для всех объектов класса, к которому применен вызов. Вы можете создать дочерние классы UITabBar и использовать appearance для них, но лучше просто кастомизировать внешний вид внутри этих классов.

    https://developer.apple.com/documentation/uikit/ui...
    Ответ написан
    Комментировать
  • Регулярные выражения в Swift?

    doublench21
    @doublench21 Куратор тега Swift
    Swift 4 Xcode 9.0
    import Foundation
    
    // Дополним String для простоты работы с NSRegularExpression
    extension String {
        // Вычислимое св-во, которое возвращает NSRange строки String
        var toNSRange: NSRange { return NSMakeRange(0, self.utf16.count) }
    
        // Метод возвращающий String по заданному NSRange
        func substringFromNSRange(with nsrange: NSRange) -> String? {
            guard let range = Range(nsrange) else { return nil }
            let start = String.UTF16Index(encodedOffset: range.lowerBound)
            let end = String.UTF16Index(encodedOffset: range.upperBound)
            return String(self.utf16[start..<end])
        }
    }
    
    var htmlContext = "products_and_categories(123123)]}"
    let regExp = try? NSRegularExpression(pattern: "products_and_categories(.*?)\\]\\}")
    let matches = regExp?.matches(in: htmlContext, range: htmlContext.toNSRange)
    for match in matches! {
        print(htmlContext.substringFromNSRange(with: match.range)!)
    }
    Ответ написан
    1 комментарий
  • Как выбрать данные из одного array на основе данных из другого?

    defaultData!.map{elem in print(currencyData[elem].codeOfCurrency) }

    Возможно
    Ответ написан
    Комментировать
  • Переходы из строк в UITableView к другим данным в рамках одного VC?

    maximglobak
    @maximglobak
    iOS developer
    Есть правило - разделяй и властвуй =) (S в SOLID)
    Придерживаясь этому правилу проект будет чище чем у тех, кто не придерживается.
    На первое время всегда кажется, что отдельный VC не нужен для этого, но зачастую логика позже начинает усложнятся и отличаться от того, что было на первом экране. Поэтому я советую разделить на два экрана и у тебя будут развязаны руки на дальнейшие изменения, да и код в одном VC будет чище.
    А экономия памяти, в таком случае, будет минимальным.
    Ответ написан
    Комментировать
  • Всплывающие окно iOS, как реализовать?

    golovanovd
    @golovanovd Автор вопроса
    Студент, iOS-разработчик
    doublench21 @doublench21
    Дмирий Голованов, https://developer.apple.com/ios/human-interface-gu...
    Написано 53 минуты назад


    https://gist.github.com/barbietunnie/e5547f3518043...

    class MainViewController: UIViewController{
        override func viewDidLoad() {
               showModal()
        }
        func showModal() {
              let modalViewController = ModalViewController()
              modalViewController.modalPresentationStyle = .OverCurrentContext
              present(modalViewController, animated: true, completion: nil)
        }
    }
    class ModalViewController: UIViewController {
        override func viewDidLoad() {
            view.backgroundColor = UIColor.clear
            view.isOpaque = false
        }
    }
    Ответ написан
    Комментировать
  • Как задать диапазон времени в swift3?

    maximglobak
    @maximglobak
    iOS developer
    Почему бы не посмотреть как это сделало Apple. Например похожий функционал есть календаре и у них для этого два покера (начало и конец). Можно конечно сделать один кастомные пикер для подбора двух дат, но есть ли в этом смысл? Удобно ли будет пользователю?
    Любое нестандартное решение требует объяснений. Но если совсем иначе никак, то можно сделать две кнопки через дефис и по каждому клику кнопки показывать дата пикер и потом присваивать заголовок кнопке в виде нужной даты. Тогда ячейка будет выглядеть следующим образов
    ——————
    Время проведения мероприятия (начало) - (конец)
    ——————
    После выполнения всех операций
    ——————
    Время проведения мероприятия ( 13:30 ) - ( 14:00 )
    ——————
    Кнопки отдельно лучше подсветить как кнопка "Загрузки" в новом AppStore
    Ответ написан
    1 комментарий
  • Какой выбрать язык программирования?

    @ZZahar
    Если решил проблему - нажми "отметить решением"
    Если игры то c++ однозначно. Можно делать под мобайл с Xamarin'ом с C# в том числе и на iOS и на Android и на Windows Phone. Если только под iOS,тогда Swift и Objective-c.
    Ответ написан
    Комментировать
  • Какой выбрать язык программирования?

    tikhonov666
    @tikhonov666
    iOS, Swift, Objective-C
    Большинство ответов, которые тут дали, совершенно не верны. Я не являюсь геймдев разработчиком, но знание языка в геймдеве это 1% от всех знаний, которые нужны для успешного создания игр. В частности под iOS выучить Swift или Objective-C обойдется в 2-3 недели, но освоить фреймворки по типу Metal, SpriteKit займет у тебя несколько месяцев, а то и больше. В геймдеве тебе понадобится математика, алгоритмы, структуры данных и тд, Computer Science вообщем, выбирай школу/универ, где это есть на хорошем уровне.

    Для начала тебе нужно четко определится, чем именно ты хочешь заниматься или писать игры под консоль или под iOS, в зависимости от ответа тебе понадобится определенный стек технологий и язык(и).
    Если выбираешь iOS, то начинай учить Swift.
    Если консоль, то C++ ( или что там нужно)

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

    ps Swift не является недоразвитым языком, он находится в стадии разработки, причем текущая версия Swift 4 может считаться стабильной и в будущем будет меняться незначительно.
    Ответ написан
    2 комментария
  • Как реализовать фоновое выполнение задач?

    maestrro712
    @maestrro712
     iOS Developer
    У iOS приложений весьма жесткий подход к background режиму. Для ваших задач действительно подходит Background fetch. Однако есть 2 момента:

    1. система сама выбирает переодичность запуска приложения. Вы можете повлиять на ее "предпочтения", делая запрос как можно быстрее, и возвращая сообщение, что вы скачали новые данные.
    2. приложение, которое пользователь убил руками (выкинул из трея) не будет запускаться для фетча совсем.

    Из-за всего этого, правильный подход - когда сервер оповещает приложение по средствам пушей, а не приложение само проверяет данные.
    Ответ написан
    Комментировать
  • Как сделать переход из ячеек tableView?

    @korolevsky_s
    iOS Developer
    Вариантов несколько, вот грубый пример передачи данных через segue. Допустим, у нас есть массив неких данных. Для примера возьмем тупо массив названий предметов let array = ["математика", "физика"]. В tableViewController №2 создаете переменную которой будете передавать название предмета var name = ""
    Создаете seque от ячейки первого контроллера ко второму. Этому seque прописываете id "Seque". Далее в tableViewController №1 прописываете метод:
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if segue.identifier == "Seque" {
                if let indexPath = self.tableView.indexPathForSelectedRow {
                    let destinationVC = segue.destination as! SecondTableViewController
                    destinationVC.name = self.array[(indexPath as NSIndexPath).row]
                }
            }
        }
    Ответ написан
    Комментировать
  • Какие паттерны используются при разработке игры?

    MrMureno
    @MrMureno Куратор тега Unity
    VR for all
    www.habrador.com/tutorials/programming-patterns
    что-то вроде того.
    Вообще есть отдельные книги и статьи по игровым паттернам.
    А еще порой стараются отделить какое-то "ядро"/логику/код - и там как в обычном программировании. паттерны и тд тп.
    Условно сделать логику, чтоб аж в консоли просто запускалось /отрабатывало/симулировалось) а потом уже к этому прикрутить юнити.
    Ответ написан
    Комментировать
  • Как зафиксировать searchBar под navigationBar?

    @AzamatBolegenov
    Он у вас скорее всего стоит внутри TableView. Нужно вытащить его оттуда
    f1ebfcfaf9684c1994a271877edcfeb6.png
    Ответ написан
    1 комментарий