2014-09-30 21 views
10

Ho una sottoclasse UIInputViewController semplice con solo due metodi sovrascritti. Io uso questo controller vista input come inputAccessoryViewController sulla sottoclasse UIViewController che diventa il primo risponditore. Provo a specificare l'altezza di inputView aggiungendo un vincolo come raccomandato dalla documentazione Apple. Il problema è che il mio vincolo non funziona e ottengo autolayout eccezione quando viene aggiunto il mio vincoloImpossibile modificare l'altezza di UIInputView

Unable to simultaneously satisfy constraints. 
Probably at least one of the constraints in the following list is one you don't want. 
... 
(
    "<NSLayoutConstraint:0x178aa1d0 V:[UIInputView:0x178a4ae0(0)]>", 
    "<NSLayoutConstraint:0x178b9520 V:[UIInputView:0x178a4ae0(500)]>" 
) 
Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x178b9520 V:[UIInputView:0x178a4ae0(500)]> 

Che credo significa che il sistema già aggiunto un vincolo di altezza pari a zero alla vista di ingresso (perché è creato con altezza zero). Ora entrano in conflitto e l'interruzione automatica interrompe il mio vincolo per risolvere il problema.

Quando provo ad usarlo come inputViewController del mio controller di visualizzazione (solo per scopi di test), ottengo la stessa eccezione ma invece di altezza zero è 216 px. Rompe anche il mio vincolo e l'altezza rimane predefinita.

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    self.inputView.translatesAutoresizingMaskIntoConstraints = NO; 
    self.inputView.backgroundColor = [UIColor redColor]; 
} 

- (void)updateViewConstraints { 

    CGFloat _expandedHeight = 500; 
    NSLayoutConstraint *_heightConstraint = 
    [NSLayoutConstraint constraintWithItem:self.view 
           attribute:NSLayoutAttributeHeight 
           relatedBy:NSLayoutRelationEqual 
            toItem:nil 
           attribute:NSLayoutAttributeNotAnAttribute 
           multiplier:0.0 
            constant: _expandedHeight]; 
    [self.inputView addConstraint: _heightConstraint]; 

    [super updateViewConstraints]; 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.view setNeedsUpdateConstraints]; 
} 

Di conseguenza, non è possibile modificare l'altezza di visualizzazione degli accessori di input. Qualcuno ci riesce? Ovviamente, la documentazione di Apple non fornisce alcun aiuto ...

+0

V: [auto (0)] è molto strano - che ha aggiunto questo vincolo? Ovviamente, ha bisogno di essere riparato o almeno rimosso. – user3125367

+0

Può essere una soluzione hacky, ma in updateConstraints trova il vincolo 0/216 (in realtà tutti i vincoli solo sull'altezza, eccetto il tuo) e imposta la sua priorità su un valore più basso, per essere saltato silenziosamente sui conflitti. – user3125367

+0

@ user3125367 "chi ha aggiunto questo vincolo?" - domanda esatta Sto cercando una risposta :) Proverò il tuo suggerimento e pubblicheremo dopo, grazie! – hybridcattt

risposta

2

Non so se questo è il problema, ma il problema potrebbe venire dal moltiplicatore 0.0 che si imposta su _heightConstraint. Prova a cambiarlo in 1.0.

Sarebbe simile a questa:

NSLayoutConstraint *_heightConstraint = 
    [NSLayoutConstraint constraintWithItem:self.view 
           attribute:NSLayoutAttributeHeight 
           relatedBy:NSLayoutRelationEqual 
            toItem:nil 
           attribute:NSLayoutAttributeNotAnAttribute 
           multiplier:1.0 
            constant: _expandedHeight]; 

Spero che questo aiuti!

0

L'ho fatto in Swift. spero che questo ti aiuti.

override func viewDidAppear(animated: Bool) { 

    let heightConstraint = NSLayoutConstraint(
     item:self.view, 
     attribute:NSLayoutAttribute.Height, 
     relatedBy:NSLayoutRelation.Equal, 
     toItem:nil, 
     attribute:NSLayoutAttribute.NotAnAttribute, 
     multiplier:0.0, 
     constant:100) 

    self.view.addConstraint(heightConstraint) 
} 
1

Quando si effettua una vista dell'ingresso vista accessorio di un UITextView, non appena la vista testo diventa first responder, un vincolo di altezza viene aggiunto automaticamente impostato su ciò che è stato inviato come l'altezza del telaio. Ad esempio:

let inputView = UIInputView(frame: CGRectMake(0, 0, view.bounds.width, 200), 
    inputViewStyle: .Default) 
someTextView.inputAccessoryView = inputView 
someTextView.becomeFirstResponder() 
assert((inputView.constraints().last as NSLayoutConstraint).constant == 200) 

È possibile modificare questo vincolo dopo il fatto.

+0

nota, funziona solo se non hai setTranslatesAutoresizingMaskIntoConstrants – moger777

+0

Questa dovrebbe essere la risposta corretta, funziona per me (a patto che i vincoli non vengano tradotti nella maschera di autoresizing) – Joshua

+0

Riguarda la vista inputAccessory di UIInputViewController non quella di someTextView. Non so perché stai parlando di quello ...È indipendente l'un l'altro – LKM

6

Dal iOS 9.0 questo può essere risolto con inputView.allowsSelfSizing = YES;

Problemi correlati