2017-11-23 85 views
5

Mam znany problem z dodaniem UIButton do UIBarButtonItem. Próbowałem dodać ograniczenia automatycznego układu, jak zasugerowano w stackoveflow, ale otrzymuję błąd opisany poniżej.ios 11 - UIButton wewnątrz UIBarButtonItem powoduje błąd autouwalniania

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

ograniczenia autoLayout:

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

ślad stosu:

[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

Zwykle używam tego bez żadnych ograniczeń i dodając elastyczne spacje 'UIBarButtonSystemItemFlexibleSpace', dlaczego potrzebujesz ograniczeń? –

+0

System iOS11 używa teraz autolayout dla 'UIBatButtonItem', tj. Ustawia również ograniczenia wiodące i końcowe dla przycisku _Sortieren_. W ten sposób nie można już ustawiać ograniczenia szerokości, tak jak Ty. Spróbuj po prostu nie ustawiać tego ograniczenia, a konflikt powinien zniknąć. –

+0

@ ReinhardMänner Potrzebuję ustawić szerokość na mój przycisk, w przeciwnym razie mój przycisk jest zbyt długi, czego byśmy się nie spodziewali. – aymeba

Odpowiedz

1

miałem ten problem również od iOS11. Rozwiązałem go, tworząc własny widok z własnym XIB i umieszczając w nim przycisk. Następnie możesz łatwo ustawić ograniczenia w InterfaceBuilder w XIB. Potem, gdy rzeczywiście chcesz go używać w barbuttonitem, kod jest bardzo krótki:

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

Tylko nie zapomnij drugą linię, gdzie trzeba rzeczywiście przypisać wybieraka dla przycisku (który jest IBOutlet w widoku niestandardowym oczywiście).

2

Przycisk paska jest ograniczony po lewej i prawej stronie, więc ograniczenie szerokości musi zostać przerwane. Możesz to naprawić, dodając elastyczne miejsce na pasku narzędzi. Pozwala to na ograniczenie szerokości przycisku i pozwala elastycznej przestrzeni wypełnić resztę.

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

w ten prosty sposób przycisk z układem automatycznego utworzyć. Przycisk Utwórz będzie miał elastyczną szerokość w zależności od rozmiaru UIView. Nie ma potrzeby dodawania dodatkowych ograniczeń.

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