2014-09-30 87 views
10

我有一個簡單的UIInputViewController子類只有兩個重寫的方法。我在我的UIViewController子類上使用這個輸入視圖控制器作爲inputAccessoryViewController,它成爲第一響應者。我嘗試通過Apple文檔推薦的約束添加約束來指定inputView的高度。 問題是,我的約束不工作,我得到的,當被加入我的約束自動佈局例外無法更改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)]> 

我想這意味着該系統已添加了一個零高度約束到輸入視圖(因爲它是與創建零高度)。現在他們發生衝突,自動佈局打破了我的限制來解決問題。

當我嘗試使用它作爲我的視圖控制器的inputViewController(僅用於測試目的)時,我得到相同的異常,但零高度爲216像素。它也打破了我的約束,高度仍然是默認值。

- (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]; 
} 

因此,我無法更改輸入配件視圖高度。有人能成功嗎?顯然,Apple文檔沒有提供幫助...

+0

V爲解決:[個體經營(0)]是很奇怪的 - 誰添加了這個約束?顯然,它需要被修復或至少被刪除。 – user3125367 2014-10-02 13:44:12

+0

可能是一個冒險的解決方案,但是在updateConstraints中發現0/216約束(實際上除了你的高度以外,實際上只是高度上的所有約束)並將其設置爲較低值的優先級,因爲它在衝突時被無聲地跳過。 – user3125367 2014-10-02 13:48:25

+0

@ user3125367「誰加了這個約束?」 - 確切的問題我正在尋找一個答案:)我會嘗試你的建議,併發布後,謝謝! – hybridcattt 2014-10-02 13:54:46

回答

2

我不知道這是否是問題,但問題可能來自您在_heightConstraint上設置的0.0乘數。嘗試將其更改爲1.0。

它應該是這樣的:

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

希望這有助於!

0

我在Swift中做過。 希望這可以幫助你。

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

當你犯了一個觀點一個UITextView輸入附件視圖,只要文本視圖成爲第一響應者,一個高度約束添加自動設置爲任何被作爲幀發送的高度。例如:

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) 

您可以在事後修改此約束。

+0

請注意,只有當你沒有setTranslatesAutoresizingMaskIntoConstrants – moger777 2014-11-10 16:37:18

+0

這應該是正確的答案,適用於我(只要約束不被轉換爲自動調整掩碼) – Joshua 2015-02-20 15:28:28

+0

這是關於UIInputViewController的inputAccessory視圖不是someTextView的。我不知道你爲什麼在談論那個......它是相互獨立的 – LKM 2016-08-06 16:25:52

6

由於iOS的9.0這可能與inputView.allowsSelfSizing = YES;