Странное поведение при вводе текста в текстовое поле после его уменьшения с помощью жеста щипка? - PullRequest
0 голосов
/ 28 января 2019

Я установил подкласс UITextView, который расширяется и сжимается, чтобы соответствовать тексту при вводе пользователем, называемый FlexibleText.В этом текстовом представлении у меня также есть Pinch Gesture Recognizer, позволяющий пользователям масштабировать его вверх и вниз.

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

Я был бы очень признателен за любую помощь в выяснении этого!Вот мой код:

import UIKit

class ViewController: UIViewController, UITextViewDelegate, UIGestureRecognizerDelegate {

class FlexibleText: UITextView {
    var horizontalConstraint: NSLayoutConstraint?
    var verticalConstraint: NSLayoutConstraint?

    var widthConstraint: NSLayoutConstraint?
    var heightConstraint: NSLayoutConstraint?
}

var currentTextView = FlexibleText()

var screenWidth = UIScreen.main.bounds.width
var screenHeight = UIScreen.main.bounds.height


override func viewDidLoad() {
    super.viewDidLoad()

    //add close keyboard recognizer
    let closeKeyboardRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    view.addGestureRecognizer(closeKeyboardRecognizer)

    let text1 = FlexibleText()
    text1.text = "your text"
    text1.font = UIFont.systemFont(ofSize: 40)
    text1.backgroundColor = UIColor.yellow
    text1.frame = CGRect(x: 50, y: 100, width: 250, height: 100)
    text1.isScrollEnabled = false
    text1.delegate = self
    text1.textAlignment = .center
    view.addSubview(text1)

    // layout
    text1.translatesAutoresizingMaskIntoConstraints = false

    text1.horizontalConstraint = text1.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0)
    text1.horizontalConstraint?.isActive = true

    text1.verticalConstraint = text1.topAnchor.constraint(equalTo: view.topAnchor, constant: 100)
    text1.verticalConstraint?.isActive = true

    text1.widthConstraint = text1.widthAnchor.constraint(equalToConstant: 250)
    text1.widthConstraint?.isActive = true
    text1.heightConstraint = text1.heightAnchor.constraint(equalToConstant: 100)
    text1.heightConstraint?.isActive = true

    adjustTextViewHeight(text1)
    currentTextView = text1

    //add pinch gesture
    let pinchGesture = UIPinchGestureRecognizer(target: self, action:#selector(pinchRecognized))
    pinchGesture.delegate = self
    text1.addGestureRecognizer(pinchGesture)

}


// flexible functions
func textViewDidChange(_ textView: UITextView) {
    adjustTextViewHeight(textView)
}

func adjustTextViewHeight(_ textView: UITextView) {

    let newSize = textView.sizeThatFits(CGSize(width: screenWidth, height: CGFloat.greatestFiniteMagnitude))

    if let currentView = textView as? FlexibleText {

        if newSize.width <= screenWidth {
            currentView.widthConstraint?.constant = newSize.width
        } else if newSize.width > screenWidth {
            currentView.widthConstraint?.constant = screenWidth
        }

        currentView.heightConstraint?.constant = newSize.height
    }

    self.view.layoutIfNeeded()
}



@objc func dismissKeyboard() {
    view.endEditing(true)
}


//pinch gesture
@objc func pinchRecognized(recognizer: UIPinchGestureRecognizer) {

    if let view = recognizer.view as? FlexibleText {

        if recognizer.state == .changed {

            view.transform = view.transform.scaledBy(x: recognizer.scale, y: recognizer.scale)

        } else if recognizer.state == .ended {
            view.font = UIFont.systemFont(ofSize: 40 * recognizer.scale)
        }

        adjustTextViewHeight(view)
        recognizer.scale = 1.0

    }

}



}

Вот изображение до уменьшения:

example

и после:

example

И снимок экрана с иерархией представлений:

example

Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Мне удалось решить эту проблему с помощью этого ответа: iOS: масштабирование UITextView с защемлением?

Это включает в себя только изменение размера шрифта в масштабе, а затем настройку представления текстаразмер к этому.Вот мой рабочий код:

import UIKit

class ViewController: UIViewController, UITextViewDelegate, UIGestureRecognizerDelegate {

class FlexibleText: UITextView {
    var horizontalConstraint: NSLayoutConstraint?
    var verticalConstraint: NSLayoutConstraint?

    var widthConstraint: NSLayoutConstraint?
    var heightConstraint: NSLayoutConstraint?
}

var currentTextView = FlexibleText()

var screenWidth = UIScreen.main.bounds.width
var screenHeight = UIScreen.main.bounds.height


override func viewDidLoad() {
    super.viewDidLoad()

    //add close keyboard recognizer
    let closeKeyboardRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    view.addGestureRecognizer(closeKeyboardRecognizer)

    let text1 = FlexibleText()
    text1.text = "your text"
    text1.font = UIFont.systemFont(ofSize: 40)
    text1.backgroundColor = UIColor.yellow
    text1.frame = CGRect(x: 50, y: 100, width: 250, height: 100)
    text1.isScrollEnabled = false
    text1.delegate = self
    text1.textAlignment = .center
    view.addSubview(text1)


    // layout
    text1.translatesAutoresizingMaskIntoConstraints = false

    text1.horizontalConstraint = text1.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0)
    text1.horizontalConstraint?.isActive = true

    text1.verticalConstraint = text1.topAnchor.constraint(equalTo: view.topAnchor, constant: 100)
    text1.verticalConstraint?.isActive = true

    text1.widthConstraint = text1.widthAnchor.constraint(equalToConstant: 250)
    text1.widthConstraint?.isActive = true
    text1.heightConstraint = text1.heightAnchor.constraint(equalToConstant: 100)
    text1.heightConstraint?.isActive = true


    adjustTextViewSize(text1)
    currentTextView = text1

    //add pinch gesture
    let pinchGesture = UIPinchGestureRecognizer(target: self, action:#selector(pinchRecognized))
    pinchGesture.delegate = self
    text1.addGestureRecognizer(pinchGesture)



}


// flexible functions
func textViewDidChange(_ textView: UITextView) {
    adjustTextViewSize(textView)
}



func adjustTextViewSize(_ textView: UITextView) {

    let newSize = textView.sizeThatFits(CGSize(width: screenWidth, height: CGFloat.greatestFiniteMagnitude))

    textView.frame = CGRect(x: (textView.frame.minX), y: (textView.frame.minY), width: newSize.width, height: newSize.height)

    if let currentView = textView as? FlexibleText {

        if newSize.width <= screenWidth {
            currentView.widthConstraint?.constant = newSize.width
        } else if newSize.width > screenWidth {
            currentView.widthConstraint?.constant = screenWidth
        }

        currentView.heightConstraint?.constant = newSize.height

    }

    self.view.layoutIfNeeded()

}



@objc func dismissKeyboard() {
    view.endEditing(true)
}


//pinch gesture
@objc func pinchRecognized(recognizer: UIPinchGestureRecognizer) {

    let scale:CGFloat = recognizer.scale

    guard let textView = recognizer.view as? FlexibleText else { return }

    textView.font = UIFont(name: textView.font!.fontName, size: textView.font!.pointSize*scale)

    adjustTextViewSize(textView)

    recognizer.scale = 1.0

}



}
0 голосов
/ 28 января 2019

добавить этот код

currentTextView.contentInsetAdjustmentBehavior = UIScrollView.ContentInsetAdjustmentBehavior.never' into your method 'viewDidLoad()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...