web-dev-qa-db-de.com

Wie gehe ich mit dem iOS 11 Navigation BarButtonItems-Fehler um?

Ich habe einen UINavigationBar-Fehler in iOS gefunden. 11.Die Schaltfläche zum Einrichten des Navigationselements in viewDidLoad mit self.navigationItem.rightBarButtonItems = @[fixSpaceItem, item]. Und benutze Gesten-Pop zurück, aber ich knalle nicht wirklich zurück. Wenn Pop Back anfängt, lasse ich meinen Finger los und lasse den Viewcontroller aufheben, Pop-Back, und dann die Elemente der rechten Navigationstaste verschwinden. Die linken Objektschaltflächen haben das gleiche Problem. Um diesen Fehler zu reproduzieren, müssen Sie fixSpaceItem wie [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil] hinzufügen. Und echtes Gerät, aber kein Simulator, kann den Fehler reproduzieren ... Hier ist mein Hauptcode: 

- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    self.navigationController.interactivePopGestureRecognizer.delegate = self;

    self.navigationItem.rightBarButtonItems = @[[self negativeSpacerWithWidth:5],[self rightButton]];
    self.navigationItem.leftBarButtonItems = @[[self negativeSpacerWithWidth:5], [self leftButton]];

}

- (UIBarButtonItem *)leftButton {
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
    [button setImage:[UIImage imageNamed:@"icon_app_back_normal"] forState:UIControlStateNormal];
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
    return item;
}

- (UIBarButtonItem *)rightButton {
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
    [button setImage:[UIImage imageNamed:@"setting"] forState:UIControlStateNormal];
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
    return item;
}

- (UIBarButtonItem *)negativeSpacerWithWidth:(CGFloat)width {
    UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
    [spacer setWidth:width];
    return spacer;
}
7
ryanzhuang

Es scheint ein Fehler zu sein, wenn Sie den FixedSpace BarButtonItem zu BarButtonItem array hinzufügen. Wenn Sie Offsets als Navigationselement festlegen möchten, müssen Sie möglicherweise eine andere Methode verwenden, beispielsweise das Ändern von imageEdgeInsets der Schaltfläche.

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do not set Fixed Space type button item.
    self.navigationItem.leftBarButtonItem = [self leftButton];
    self.navigationItem.rightBarButtonItem = [self rightButton];

    // It work too
    //self.navigationItem.leftBarButtonItems = @[[self leftButton], [self leftButton]];
    //self.navigationItem.rightBarButtonItems = @[[self rightButton], [self rightButton]];


    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    self.navigationController.interactivePopGestureRecognizer.delegate = self;
}

- (UIBarButtonItem *)leftButton
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
    //...

    // to add offset you want
    button.imageEdgeInsets = UIEdgeInsetsMake(0, -15, 0, 15);

    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
    return item;
}

- (UIBarButtonItem *)rightButton
{
    UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 35, 35)];
    //...

    // to add offset you want
    button.imageEdgeInsets = UIEdgeInsetsMake(0, 15, 0, -15);

    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:button];
    return item;
}
3
ovo
let hamButtonWidthConstraint = hamButton.widthAnchor.constraint(equalToConstant: 40)

let hamButtonHeightConstraint = hamButton.heightAnchor.constraint(equalToConstant: 40)

hamButtonWidthConstraint.isActive = true

hamButtonHeightConstraint.isActive = true
0
Urvish Modi

Ich habe versucht, das Bild so anzupassen, dass es in das Navigationselement passt, und es hat funktioniert. Obwohl Sie die Größe Ihrer Bilder nicht wirklich ändern müssen, können Sie die unten angegebene Funktion verwenden, um die Größe des Bildes zur Laufzeit zu ändern.

    UIImage *imgCart = [self imageWithImage:[UIImage imageNamed:@"ic_cart"] scaledToSize:CGSizeMake(35, 35)] ;
    UIButton *btnCart = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
    [btnCart addTarget:self action:@selector(btnCartClicked:) forControlEvents:UIControlEventTouchUpInside];
    [btnCart setBackgroundImage:imgCart forState:UIControlStateNormal];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btnCart];



-(UIImage *)imageWithImage:(UIImage *)image scaledToSize:(CGSize)newSize {
    //UIGraphicsBeginImageContext(newSize);
    // In next line, pass 0.0 to use the current device's pixel scaling factor (and thus account for Retina resolution).
    // Pass 1.0 to force exact pixel size.
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}
0
Yahya Ibrahim