Задать вопрос
  • Как изменить высоту ячейки при изменении text View Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    briahas, Aleksandr Govorukhin, что касается SOLID, я недавно описывал все 23 паттерна на Swift. Писанину особо на очепятки не проверял, времени не было. Если интересно:
    https://github.com/j-jeudesprit/Creational-patterns
    https://github.com/j-jeudesprit/Structural-patterns
    https://github.com/j-jeudesprit/Behavioral-patterns
  • Как работает HTTP_USER_AGENT и какой от него толк?

    doublench21
    @doublench21
    JackShcherbakov, без каких танцев? Это строка содержит всю нужную информацию. Просто никто никогда не договаривался о конкретно чётком стандарте этой строки, но опять, они ни настолько разнятся по структуре.
  • Как работает HTTP_USER_AGENT и какой от него толк?

    doublench21
    @doublench21
    JackShcherbakov, в общем и целом, нужно просто искать соответсвующие упоминания тех или иных версий ос, движков, названий и т.д. Так или иначе, у каждого устройства, это строка более-менее похожа. Вот пример реализации на js. Можно найти и другие. Можешь для начала сам зайти из двух любых разных браузеров, посмотреть на две строки, запихнуть в какой-либо сервис, получить ответ, а потому самому разобраться, где это инфа хранилась в этих строках.

    Задача разбора все возможных таких строк непростая.
  • Как работает HTTP_USER_AGENT и какой от него толк?

    doublench21
    @doublench21
    JackShcherbakov, для начала читаем тут, а лучше тут.

    Вкратце, это строка содержит информацию об ос, движке, версии браузера. Как узнать эту информацию из этой строки - это уже другой вопрос. Но обычно вы этого сами не делаете, есть куча сервисов и библиотек, которые по этой строке выведут вам эту информацию.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, немного допилил, скролл пашет. Но иногда прыгает. Тут надо шаманить дальше или на stackoverflow.com написать.
    func textViewDidChange(_ textView: UITextView) {
            let rectOfCell = tableView.rectForRow(at: IndexPath(row: 0, section: 2))
            let rectOfCellInSuperView = tableView.convert(rectOfCell, to: tableView.superview)
            let rectKeyboardInTableViewSuperView = tableView.convert(keyboardFrame, to: tableView.superview)
            if rectOfCellInSuperView.maxY < rectKeyboardInTableViewSuperView.origin.y - 18 {
                UIView.setAnimationsEnabled(false)
                tableView.beginUpdates()
                tableView.endUpdates()
                UIView.setAnimationsEnabled(true)
                tableView.setContentOffset(currentOffset, animated: false)
            } else if rectOfCellInSuperView.maxY >= rectKeyboardInTableViewSuperView.origin.y - 18, textView.numberOfLines > prevNumberOfLines {
                currentOffset.y += 16.5
                UIView.animate(withDuration: 0.2, animations: {
                    self.tableView.contentOffset = CGPoint(x: self.currentOffset.x, y: self.currentOffset.y)
                }, completion: { (succes: Bool) in
                    UIView.setAnimationsEnabled(false)
                    self.tableView.beginUpdates()
                    self.tableView.endUpdates()
                    UIView.setAnimationsEnabled(true)
                    self.prevNumberOfLines += 1
                })
            }
    
            print(rectOfCellInSuperView.maxY)
            print(rectKeyboardInTableViewSuperView.origin.y)
            print(currentOffset.y)
            print(tableView.contentOffset.y)
            print("***")
        }
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, да хз. Есть код, ток не могу понять, он скроллит лишь раз, как надо, а затем меняет значение оффсета, а скроллить отказывается. Если сам починишь этот скролл, то вроде то что тебе нужно.
    class ViewController: UITableViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: .UIKeyboardDidShow, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidHide), name: .UIKeyboardDidHide, object: nil)
        }
    
        override func numberOfSections(in tableView: UITableView) -> Int {
            return 4
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 1
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            if indexPath.section == 0 {
                return tableView.dequeueReusableCell(withIdentifier: "First", for: indexPath)
            } else if indexPath.section == 1 {
                return tableView.dequeueReusableCell(withIdentifier: "Second", for: indexPath)
            } else if indexPath.section == 2 {
                return tableView.dequeueReusableCell(withIdentifier: "Third", for: indexPath)
            } else {
                return tableView.dequeueReusableCell(withIdentifier: "Fours", for: indexPath)
            }
        }
    
        override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            if indexPath == IndexPath(row: 0, section: 2) {
                return UITableViewAutomaticDimension
            }
            return super.tableView(tableView, heightForRowAt: indexPath)
        }
    
        @objc func keyboardDidShow(_ notification: NSNotification) {
            keyboardFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
            currentOffset = tableView.contentOffset
        }
    
        @objc func keyboardDidHide(_ notification: NSNotification) {
    
        }
    
        private var keyboardFrame = CGRect.zero
        private var prevNumberOfLines = 1
        private var currentOffset = CGPoint.zero
    }
    
    extension ViewController: UITextViewDelegate {
        func textViewDidChange(_ textView: UITextView) {
            let rectOfCell = tableView.rectForRow(at: IndexPath(row: 0, section: 2))
            let rectOfCellInSuperView = tableView.convert(rectOfCell, to: tableView.superview)
            let rectKeyboardInTableViewSuperView = tableView.convert(keyboardFrame, to: tableView.superview)
            if rectOfCellInSuperView.maxY < rectKeyboardInTableViewSuperView.origin.y - 18 {
                UIView.setAnimationsEnabled(false)
                tableView.beginUpdates()
                tableView.endUpdates()
                tableView.setContentOffset(currentOffset, animated: false)
                UIView.setAnimationsEnabled(true)
            } else { // тут ещё добавить условие, когда кол-во строк меняется на одну
                currentOffset.y += 16.5
                UIView.setAnimationsEnabled(false)
                tableView.beginUpdates()
                tableView.endUpdates()
                tableView.setContentOffset(CGPoint(x: currentOffset.x, y: currentOffset.y), animated: false)
                UIView.setAnimationsEnabled(true)
            }
    
            print(rectOfCellInSuperView.maxY)
            print(rectKeyboardInTableViewSuperView.origin.y)
            print(currentOffset.y)
            print(tableView.contentOffset.y)
            print("***")
        }
    }
    
    
    extension UITextView {
        var numberOfLines: Int {
            let layoutManager = self.layoutManager
            let numberOfGlyphs = layoutManager.numberOfGlyphs
            var numberOfLines = 0
            var index = 0
            var lineRange = NSRange()
    
            while (index < numberOfGlyphs) {
                layoutManager.lineFragmentRect(forGlyphAt: index, effectiveRange: &lineRange)
                index = NSMaxRange(lineRange)
                numberOfLines = numberOfLines + 1
            }
    
            return numberOfLines
        }
    }
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, видно, что метод топорный, сначала увеличивают высоту, затем скроллится вниз. Ну если нужно, сейчас подумаю. Собственно я изначально думал так, просто мне показалось, что вам нужно решение вообще.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, это то, о чём я писал выше. Тогда сил моих больше нет, я хз что тебе надо и как.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, скролл надо врубить конечно.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, попробуй. Вроде должно делать. Конечно, код утрированный, но суть думаю ясна. У меня вроде работало.

    class ViewController: UITableViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
    
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: .UIKeyboardDidShow, object: nil)
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidHide), name: .UIKeyboardDidHide, object: nil)
        }
    
        override func numberOfSections(in tableView: UITableView) -> Int {
            return 4
        }
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 1
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            if indexPath.section == 0 {
                return tableView.dequeueReusableCell(withIdentifier: "First", for: indexPath)
            } else if indexPath.section == 1 {
                return tableView.dequeueReusableCell(withIdentifier: "Second", for: indexPath)
            } else if indexPath.section == 2 {
                return tableView.dequeueReusableCell(withIdentifier: "Third", for: indexPath)
            } else {
                return tableView.dequeueReusableCell(withIdentifier: "Fours", for: indexPath)
            }
        }
    
        @objc func keyboardDidShow(_ notification: NSNotification) {
            let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 2))
            let keyboardFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
            let cellPointY = cell!.frame.origin.y
            tableView.setContentOffset(CGPoint(x: 0, y: tableView.contentOffset.y + cellPointY), animated: true)
            cell!.frame = CGRect(x: 0, y: cell!.frame.origin.y, width: cell!.frame.width, height: cell!.frame.height + (keyboardFrame.origin.y - cell!.frame.maxY))
        }
    
        @objc func keyboardDidHide(_ notification: NSNotification) {
    
        }
    }
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, сейчас я сам попробую. Чуть позже напишу.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Покажите метод делегата дата сорс.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, а может надо выбрать не секцию, а саму ячейку? 4, 0.
    Он не может не работать) Сколько у вас кастомных ячеек? И сколько секций вы указывали в делгате дата сорс.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, А зачем? Если я не ошибаюсь, то метод который я советовал в самом начале, при выборе направления .top отскроллит ячейку до самого верха. После останется лишь увеличить высоту ячейки вместе с текст виев вплоть до начала клавиатуры и не забыть включить скролл. Теперь вводить будет удобно. Поле для ввода большое и текст скроллится. После ввода вы увеличите ячейку на всю высоту текста.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, Поясняю, вы тыкаете на поле для ввода. После ячейка занимает все доступное пространство вплоть до клавиатуры. (Не знаю что вы хотите сделать с самой клавиатурой, но ее никуда не деть, только убрать, но тогда печать как?) теперь вы растянуло ячейку и остаётся включить скролл. Теперь вы будете печатать и как только текста будет много , сработает наш скролл. После того как вы закончили ввод, вы расстягиваете ячейку уже на всю высоту текста, не учитывая клавиатуры, ведь ее уже нет.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    А вы хотите не включая скролл автоматом двигать текст выше, что бы он не наезжал за Клаву. Так ведь никто не делает, только геморрой себе наживёте.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, значит вам надо растягивать ровно до самой клавиатуры и затем при вводе включать скролл у поле для ввода. А когда он введёт инфу, отловите это и расстанете на всю высоту текста, после того как клавиатура исчезнет.
  • Как скройлить text View при вводе текста Swift 4?

    doublench21
    @doublench21 Куратор тега Swift
    Aleksandr Govorukhin, а вы вообще скролл включаете и вашего uitextview? Я не могу понять, как у вас текст может оставаться под клавиатурой, если вы говорите что вы скроллите так же как и на гифке и при этом включаете скролл у самого поля. В чем проблема ?) вводите хоть весь том Войны и мира.