2017-11-23 237 views
5

UIBarButtonItem içine UIButton ekleme ile ilgili bilinen bir sorun var. stackoveflow'da önerildiği gibi otomatik yerleşim kısıtlamaları eklemeyi denedim, ancak aşağıda açıklandığı gibi bir hata alıyorum.ios 11 - UIBarButtonIt içerisindeki UIButton öğesi, otomatik düzenleme hatası veriyor

UIButton *sortButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
[sortButton setFrame:CGRectMake(10, 0, 100, 30)]; 
[sortButton setTitle:@"Sort" forState:UIControlStateNormal]; 
[[sortButton titleLabel] setFont:[UIFont boldSystemFontOfSize:13]]; 
[sortButton setBackgroundImage:[UIImage imageNamed:@"backgroun-button.png"] forState:UIControlStateNormal]; 
[sortButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
[sortButton addTarget:self action:@selector(sortCollection:) forControlEvents:UIControlEventTouchUpInside]; 
[sortButton applyNavBarConstraints:100 height:30]; 

[self setSortCollection:item]; 

[self setToolbarItems:[NSArray arrayWithObjects:self.sortCollection, nil]]; 

autoLayout kısıtlamalar:

- (void)applyNavBarConstraints:(CGFloat)width height:(CGFloat)height 
{ 
    if (width == 0 || height == 0) { 
     return; 
    } 

    NSLayoutConstraint* w = [self.widthAnchor constraintEqualToConstant:width]; 
    NSLayoutConstraint * h = [self.heightAnchor constraintEqualToConstant:height]; 

    [w setActive:YES]; 
    [h setActive:YES]; 
} 

Yığın izleme: Ben iOS11 beri de bu sorunu yaşadım

[LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
    (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x608000280af0 h=--& v=--& UIToolbar:0x7f85ca1327e0.width == 768 (active)>", 
    "<NSLayoutConstraint:0x6000002826c0 _UIToolbarContentView:0x7f85ca1307b0.trailing == UIToolbar:0x7f85ca1327e0.trailing (active)>", 
    "<NSLayoutConstraint:0x600000282580 H:|-(0)-[_UIToolbarContentView:0x7f85ca1307b0] (active, names: '|':UIToolbar:0x7f85ca1327e0)>", 
    "<NSLayoutConstraint:0x600000285410 H:|-(0)-[_UIButtonBarStackView:0x7f85ca135660] (active, names: '|':_UIToolbarContentView:0x7f85ca1307b0)>", 
    "<NSLayoutConstraint:0x600000285460 _UIButtonBarStackView:0x7f85ca135660.trailing == _UIToolbarContentView:0x7f85ca1307b0.trailing (active)>", 
    "<NSLayoutConstraint:0x600000285500 UIButton:0x7f85ca131b90'Sortieren'.width == 100 (active)>", 
    "<NSLayoutConstraint:0x608000280ff0 'UISV-canvas-connection' UILayoutGuide:0x6000001ba240'UIViewLayoutMarginsGuide'.leading == UIButton:0x7f85ca131b90'Sortieren'.leading (active)>", 
    "<NSLayoutConstraint:0x608000280d70 'UISV-canvas-connection' UILayoutGuide:0x6000001ba240'UIViewLayoutMarginsGuide'.trailing == UIButton:0x7f85ca131b90'Sortieren'.trailing (active)>", 
    "<NSLayoutConstraint:0x600000284f10 'UIView-leftMargin-guide-constraint' H:|-(0)-[UILayoutGuide:0x6000001ba240'UIViewLayoutMarginsGuide'](LTR) (active, names: '|':_UIButtonBarStackView:0x7f85ca135660)>", 
    "<NSLayoutConstraint:0x600000285190 'UIView-rightMargin-guide-constraint' H:[UILayoutGuide:0x6000001ba240'UIViewLayoutMarginsGuide']-(0)-|(LTR) (active, names: '|':_UIButtonBarStackView:0x7f85ca135660)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000285500 UIButton:0x7f85ca131b90'Sortieren'.width == 100 (active)> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 
+0

Normalde bunu herhangi bir kısıtlama olmadan kullanıyorum ve esnek alanlara 'UIBarButtonSystemItemFlexibleSpace' ekleyerek neden kısıtlamaya ihtiyacınız var? –

+0

iOS11, artık "UIBatButtonItem" için autolayout kullanıyor, yani _Sortieren_ düğmeniz için ileri ve geri kalan kısıtlamalar getiriyor. Böylece, siz de yaptığınız gibi bir genişlik kısıtlaması ayarlamak artık mümkün değildir. Bu kısıtlamayı belirlememeyi deneyin ve çatışma gitmiş olmalı. –

+0

@ ReinhardMänner Düğüme genişlik ayarlamam gerekiyor, aksi takdirde düğmem beklemeyeceğimiz çok uzun. – aymeba

cevap

1

. Kendi XIB'si ile özel bir görünüm oluşturarak çözdüm ve ona bir düğme yerleştirdim. Ardından, XIB'deki InterfaceBuilder içindeki kısıtlamaları kolayca ayarlayabilirsiniz.

self.customButtonView = [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([CustomButtonView class]) owner:nil options:nil] objectAtIndex:0]; 
[self.customButtonView.button addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpInside]; 
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:self.customButtonView]; 

Sadece aslında bir IBOutlet olan düğme için bir seçici (atamak zorunda ikinci çizgiyi unutma: aslında bir barbuttonitem kullanmak istediğinizde Ardından, kod çok kısa özel görünümde).

2

Çubuk düğmesi sola ve sağa doğru sıkıştırılmış olduğundan, genişlik sınırının kırılması gerekir. Araç çubuğuna esnek bir alan ekleyerek bunu düzeltebilirsiniz. Bu, düğmenin genişliğine uymanıza ve esnek alanın kalanını doldurmanıza olanak tanır.

Obj C:

UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 
[self setToolbarItems:[NSArray arrayWithObjects:self.sortCollection, flexItem, nil]]; 

Swift:

let flexItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
toolbar.setItems([barButtonItem, flexItem], animated: false) 
1

Kullanım oto düzeniyle düğmesi oluşturmak için bu basit bir yolu. Oluştur düğmesi, UIView'nin boyutuna göre esnek genişliğe sahip olacaktır. Ekstra kısıtlamalar eklemenize gerek yoktur.

UIButton *sortButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [sortButton setFrame:CGRectMake(10, 0, self.view.frame.size.width - 10, 30)];