2014-04-13 10 views
6

I został zbudowany rosnące UITextView dołączony do klawiatury, podobny do aplikacji Wiadomości giełdowe, przez ładowanie .xib w klawiaturę za inputAccessoryView jako takie:iOS Klawiatura - wejście Accessory Zobacz xib z autolayout nieotrzymania dotykowego wydarzenie

self.keyboardAccessoryView = [[[NSBundle mainBundle] 
          loadNibNamed:@"KeyboardAccessoryView" 
          owner:self options:nil] 
          firstObject]; 

.xib wygląda i wykorzystuje ograniczenia układu tak, że TextView rośnie pionowo, gdy użytkownik wprowadzi kolejne linijki tekstu:

enter image description here

to wszystko działa doskonale, z rotacją i wszystko je ng, z wyjątkiem jednego dużego błędu - gdy tekst jest wieloliniowy, tylko dolna linia obsługuje zdarzenia dotykowe. Oznacza to, że użytkownik nie może przewijać wewnątrz UITextView, ponieważ ich zdarzenia dotyku są przekazywane do (ciemnoszarego) widoku z tyłu i przewijane w zamian. Nie mogą także wybierać i edytować tekstu w trzech pierwszych wierszach.

enter image description here

Myślę, że mógłbym zrobić obejście poprzez przechwytywanie współrzędne wszystkich zdarzeń kranu i sprawdzenie, czy klawiatura jest otwarty i jak wysoki UITextView jest, to wybór odpowiedniego elementu do otrzymania dotykowy zdarzenia. Ale jest to kruche rozwiązanie, które jest bardziej skomplikowane z obrotem. Czy jest coś, czego mi brakuje w moim automatycznie rosnącym podejściu do wyświetlania tekstu, czy też łatwiejszej do naprawienia?

+0

Mam problem z uzyskaniem wiązań automatycznego układu, aby powiększyć widok akcesoriów w pionie. Gram z układem Czy masz szansę podzielić się spostrzeżeniami? Mogę tylko powiększyć widok tekstowy (poprzez zmianę jego ograniczenia rozmiaru), podczas gdy widok jego akcesoriów pozostaje oryginalny. – rainypixels

Odpowiedz

2

Doszedłem do wniosku, że pomimo, że wejście klawiatury akcesoriów rośnie pionowo z automatycznym układem, jego ramka nie. Musisz więc dostosować ramkę akcesorium klawiatury za każdym razem, gdy wysokość widoku uitext rośnie, kurczy się i obraca. Wprowadza to pewne komplikacje, ponieważ UITextView w iOS7 są notorycznie błędne - zauważyłem, że zachowanie nie było spójne w przypadku iPhone'a, iPada i symulatora.

+2

Masz jakiś kod do tego? – Magoo

5

Aby widok akcesoriów wejściowych rósł pionowo, wystarczy ustawić jego autoresizingMask = .flexibleHeight, obliczyć jego intrinsicContentSize i pozwolić ramie wykonać resztę.

Kod:

class InputAccessoryView: UIView, UITextViewDelegate { 

    let textView = UITextView() 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     // This is required to make the view grow vertically 
     self.autoresizingMask = UIViewAutoresizing.flexibleHeight 

     // Setup textView as needed 
     self.addSubview(self.textView) 
     self.textView.translatesAutoresizingMaskIntoConstraints = false 
     self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[textView]|", options: [], metrics: nil, views: ["textView": self.textView])) 
    self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[textView]|", options: [], metrics: nil, views: ["textView": self.textView])) 

     self.textView.delegate = self 

     // Disabling textView scrolling prevents some undesired effects, 
     // like incorrect contentOffset when adding new line, 
     // and makes the textView behave similar to Apple's Messages app 
     self.textView.scrollEnabled = false 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override var intrinsicContentSize: CGSize { 
     // Calculate intrinsicContentSize that will fit all the text 
     let textSize = self.textView.sizeThatFits(CGSize(width: self.textView.bounds.width, height: CGFloat.max)) 
     return CGSize(width: self.bounds.width, height: textSize.height) 
    } 

    // MARK: UITextViewDelegate 

    func textViewDidChange(_ textView: UITextView) { 
     // Re-calculate intrinsicContentSize when text changes 
     self.invalidateIntrinsicContentSize() 
    } 

} 

Takie podejście jest dość prosty i niezawodny, ponieważ nie wymaga hacking ograniczenia lub odtworzenie widok za każdym razem jego zmiany rozmiaru.

+0

Myślę, że to nadal przechodzi przez dotyk do widoku za widokiem akcesoriów chociaż – Erich

+0

@ Erich I podwójnie sprawdzone i nie mają problemów z propagacją zdarzeń dotykowych podczas korzystania z tego podejścia. Może konfiguracja widoku akcesoriów wejściowych różni się w jakiś sposób? Mój opiera się na tym: https://robots.thoughtbot.com/input-accessorizing-uiviewcontroller – maxkonovalov

+0

To jest po prostu niesamowite! Max, dziękuję bardzo za podzielenie się z nami. –

Powiązane problemy