it-swarm.com.de

So bearbeiten Sie leere Leerzeichen von UIBarButtonItem in UINavigationBar [iOS 7]

Ich habe früher iOS 6.1 verwendet, aber jetzt bin ich zu iOS 7 übergegangen. Neben anderen Problemen habe ich festgestellt, dass in meiner Navigationsleiste der linke Bereich des linken Schaltflächenelements und der rechte leere Bereich des rechten Symbolleistenelements recht groß sind mehr in IOS 7 als in iOS 6.

Ich muss wissen, gibt es eine Möglichkeit, leere Bereiche der linken, rechten Leiste in der Navigationsleiste zu reduzieren?

Danke im Voraus.

79
Salman Zaidi

Ich stand auch vor diesem Problem. Ich habe auch das Gefühl, dass in iOS 7 mehr Platz ist. Und ich habe herausgefunden, dass dies etwa 10 Punkte mehr sind. Ich verwende normalerweise negative Leerzeichen, wenn LeftBarItemButton am Rand beginnen soll. Dies kann auch für Sie nützlich sein.

UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];

negativeSpacer.width = -16; // it was -6 in iOS 6

[self.navigationItem setLeftBarButtonItems:@[negativeSpacer, requiredButton]; /* this will be the button which you actually need */] animated:NO];
217
Adnan Aftab

Basierend auf @C_X seiner Antwort habe ich eine Kategorie erstellt, die das UIBarButtonItem auf der iOS-Version des aktuellen Geräts hinzufügt und positioniert.

// UINavigationItem+Additions.h
@interface UINavigationItem (Additions)
- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem;
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem;
@end

// UINavigationItem+Additions.m
@implementation UINavigationItem (Additions)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        // Add a negative spacer on iOS >= 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                              target:nil action:nil];
        negativeSpacer.width = -10;
        [self setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, leftBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setLeftBarButtonItem:leftBarButtonItem];
    }
}

- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        // Add a negative spacer on iOS >= 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                       target:nil action:nil];
        negativeSpacer.width = -10;
        [self setRightBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, rightBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setRightBarButtonItem:rightBarButtonItem];
    }
}

@end

In Ihrem View Controller können Sie nun [self.navigationItem addLeftBarButtonItem:leftBarButtonItem]; und [self.navigationItem addRightBarButtonItem:rightBarButtonItem]; verwenden.

Ich habe auch versucht, Subclassing UIButton und überschreiben -alignmentRectInsets, aber dies gab mir Probleme mit Übergängen zwischen Ansichten.

23
smek

Für Swift 2.0 war dies meine Lösung, um den folgenden Effekt zu erzielen ...

(Die tatsächlichen Werte können je nach Situation unterschiedlich sein.)

enter image description here

let captureButton = UIButton()
captureButton.setTitle("CAPTURE DETAILS", forState: .Normal)
captureButton.frame = CGRectMake(0, 0, 200, 95)
captureButton.addTarget(self, action: Selector("showCaptureDetailsForm:"), forControlEvents: .TouchUpInside) // *** See update below for Swift 2.2 syntax
captureButton.setBackgroundImage(UIImage(named: "blueTopRight"), forState: .Normal)

let rightBarButton = UIBarButtonItem()
rightBarButton.customView = captureButton        

let negativeSpacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
negativeSpacer.width = -25;

self.navigationItem.setRightBarButtonItems([negativeSpacer, rightBarButton ], animated: false)

Swift 2.2 UPDATE:

Für Swift 2.2 hat sich die Methode action: Selector Geändert und sollte wie folgt eingegeben werden

captureButton.addTarget(self, action: #selector(YourViewController.showCaptureDetailsForm(_:)), forControlEvents: .TouchUpInside)

10
Simon

Um diesen Fehler zu beheben, müssen Sie die Unterklasse UIButton eingeben, damit Sie alignmentRectInsets überschreiben können. Bei meinem Test müssen Sie eine UIEdgeInsets entweder mit einem positiven Rechtsversatz oder einem positiven Linksversatz zurückgeben, abhängig von der Position der Schaltfläche. Diese Zahlen haben für mich keinen Sinn (mindestens eine von ihnen sollte nach dem gesunden Menschenverstand negativ sein), aber das funktioniert eigentlich:

- (UIEdgeInsets)alignmentRectInsets {
    UIEdgeInsets insets;
    if (IF_ITS_A_LEFT_BUTTON) {
        insets = UIEdgeInsetsMake(0, 9.0f, 0, 0);
    } 
    else { // IF_ITS_A_RIGHT_BUTTON
        insets = UIEdgeInsetsMake(0, 0, 0, 9.0f);
    }
    return insets;
}

Vielen Dank an @zev für den Vorschlag, dass ich versuche, alignmentRectInsets anzupassen.

6
jaredsinclair

für Swift können Sie das tun

var negativeSpace:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil)
negativeSpace.width = -17.0
self.navigationItem.rightBarButtonItems = [negativeSpace, requiredButton /* this will be the button which you actually need */]
5
reza pahlevi

Nach smeks Führung habe ich eine Kategorie erstellt, diese jedoch geändert, um Abwärtskompatibilität zu gewährleisten, anstatt nach vorne. Ich stelle alles so ein, dass ich es in iOS 7 so einstellen kann, dass der Benutzer etwas niedriger läuft, und fange an, mich mit Dingen zu beschäftigen. 

@interface UINavigationItem (BarButtonItemSpacingSupport)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem;
- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem;

@end

@implementation UINavigationItem (BarButtonItemSpacingSupport)

- (void)addLeftBarButtonItem:(UIBarButtonItem *)leftBarButtonItem
{
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        // Add a spacer on when running lower than iOS 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                                                                        target:nil action:nil];
        negativeSpacer.width = 10;
        [self setLeftBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, leftBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setLeftBarButtonItem:leftBarButtonItem];
    }
}

- (void)addRightBarButtonItem:(UIBarButtonItem *)rightBarButtonItem
{
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        // Add a spacer on when running lower than iOS 7.0
        UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                           initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                           target:nil action:nil];
        negativeSpacer.width = 10;
        [self setRightBarButtonItems:[NSArray arrayWithObjects:negativeSpacer, rightBarButtonItem, nil]];
    } else {
        // Just set the UIBarButtonItem as you would normally
        [self setRightBarButtonItem:rightBarButtonItem];
    }
}

@end

Und um dies global zu erhalten, habe ich eine dünne UIViewController-Unterklasse, von der alle meine View-Controller erben.

@interface INFViewController : UIViewController

@end

@implementation INFViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
        [self setupNavBarForPreIOS7Support];
    }
}

- (void)setupNavBarForPreIOS7Support {
    if (self.navigationController) {
        UINavigationItem *navigationItem = self.navigationItem;
        UIBarButtonItem *leftItem = navigationItem.leftBarButtonItem;
        UIBarButtonItem *rightItem = navigationItem.rightBarButtonItem;

        if (leftItem) {
            [navigationItem addLeftBarButtonItem:leftItem];
        }

        if (rightItem) {
            [navigationItem addRightBarButtonItem:rightItem];
        }
    }
}

@end

Ich stelle fest, dass ich die Betriebssystemversion zweimal überprüfe (einmal in INFViewController und noch einmal in der Kategorie). Ich habe es in der Kategorie gelassen, da ich dies einmalig überall im Projekt verwenden möchte.

5
Chris Wagner

Swift 3:

let negativeSpacer:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil)
        negativeSpacer.width = -10
self.navigationItem.leftBarButtonItems = [negativeSpacer, yourBarButtonItem]
4
Dvole

Dies ist meine Lösung für Swift 3.0:

rightBtn.imageInsets = UIEdgeInsets(top: 0, left: -13.0, bottom: 0, right: 13.0) self.navigationItem.rightBarButtonItem = rightBtn
4
tuandapen

Swift 3.1

Geben Sie dem linken Bar-Schaltflächenelement einen negativen Platz ein:

    let backButton = UIButton.init(type: .custom)
    backButton.frame = CGRect.init(x: 0, y: 0, width: 40, height: 40)
    // negative space
    backButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: -44.0, bottom: 0, right: 0)
    backButton.setImage(Ionicons.iosArrowBack.image(30, color: UIColor(hex: 0xFD6250)), for: .normal)
    backButton.addTarget(self, action: #selector(InviteVC.goBack), for: .touchUpInside)   
    // set back button
    self.navigationItem.leftBarButtonIteUIBarButtonItem.init(customView: backButton) 

2
rp2701
As of iOS 11 wont accept negative space width, in order to align the bar button items to the margin, I have used the below code.

 override func viewWillLayoutSubviews() {
                super.viewWillLayoutSubviews()
                for view in (self.navigationController?.navigationBar.subviews)! {
                    view.layoutMargins = UIEdgeInsets.zero
                }
            }
2
vinny

Ich glaube, Sie müssen eine benutzerdefinierte Schaltfläche mit einer Unterklasse UIButton verwenden. In Ihrer Unterklasse überschreiben Sie -alignmentRectInsets . Ich vergesse, ob Sie einen positiven oder negativen Wert für die entsprechende Kante benötigen, damit sich die Kante korrekt verschiebt. Wenn jedoch einer nicht funktioniert, versuchen Sie es mit dem anderen.

0
Zev Eisenberg

arbeitete für mich

rightBarButton.customView? .transform = CGAffineTransform (translationX: 10, y: 0)

0
junky

Negetive Space funktioniert unter iOS 11 nicht

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    // to remove navigation bar extra margin
    for view in (self.navigationController?.navigationBar.subviews)! {
        view.layoutMargins = UIEdgeInsets.zero
    }
}

Der obige Code entfernt den Rand von beiden Seiten leftBarButtonItem und RightBarButtonItem. Wenn Sie einen zusätzlichen Rand hinzufügen müssen (nachdem Sie den Rand entfernt haben), fügen Sie den folgenden Code hinzu

    let rightButton = UIButton(frame: CGRect(x: 0, y: 0, width: 17, height: 20))
    rightButton.setImage(UIImage(named: "ic_cart"), for: .normal)

    let rightBarButtomItem = UIBarButtonItem(customView: rightButton)

    let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.fixedSpace, target: nil, action: nil)
    spacer.width = 28 //This will add extra margin on right side
    navigationItem.rightBarButtonItems = [spacer,rightBarButtomItem]
0
Rafiqul Hasan