বাম দিকের খালি স্থানগুলি কীভাবে সম্পাদনা করবেন, ইউআইএনএভিগেশনবারে ডান ইউআইবারবারটন আইটেম [আইওএস 7]


84

আমি আগে আইওএস 6.1 ব্যবহার করছিলাম তবে এখন আমি আইওএস 7 এ চলে এসেছি। অন্যান্য সমস্যার পাশাপাশি আমি লক্ষ্য করেছি যে আমার নেভিগেশন বারে, বাম বারের বোতামের আইটেমের বাম স্থান এবং ডান বোতাম বার আইটেমের ডান ফাঁকা স্থান বেশ আইওএস in-এ আইওএস than-এর চেয়ে বেশি।

আমার জানতে হবে এমন কোন উপায় আছে যা আমি নেভিগেশন বারে বাম, ডান বার বোতাম আইটেমগুলির ফাঁকা স্থান হ্রাস করতে পারি ??

আগাম ধন্যবাদ.


4
এটি ব্যবহার করে দেখুন: github.com/devxoul/UINavicationItem-Margin
devxoul

@ ডিভডসোল, ইউআইএনএভিগেশন আইটেম-মার্জিন আইওএস 14 নিয়ে ইস্যু করেছে। আমি এটির জন্য সমস্যা তৈরি করেছি যদি আপনার কোনও সমাধান থাকে তবে দয়া করে এটি দেখুন।
কুলদীপ

উত্তর:


222

আমিও এই সমস্যার মুখোমুখি হয়েছি। আমার অনুভূতিও রয়েছে যে আইওএস 7-তে আরও বেশি জায়গা রয়েছে। এবং আমি বুঝতে পেরেছি যে এটি প্রায় 10 পয়েন্ট বেশি। আমি LeftBarItemButtonপ্রান্ত থেকে শুরু করতে চাইলে আমি সাধারণত নেতিবাচক স্পেস ব্যবহার করি । এটি আপনার পক্ষেও কার্যকর হতে পারে।

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

4
এটি আইওএস in-তে সত্যই কাজ করছে, যেহেতু আমি এই মুহূর্তে আমার কয়েকটি প্রকল্পে এটি ব্যবহার করছি ... পয়েন্ট সিস্টেমে পার্থক্য রয়েছে তাই আপনাকে তার যত্ন নিতে হবে ....
আদনান আফতাব

10
আপনি [এনএসআর অ্যারে উইথঅবজেক্টস: প্রয়োজনীয় বাটন, নেগেটিভস্পেসার] করলে এটি কার্যকর হয় না। অর্ডার মনে মনে।
Mert বুরণ

4
দুর্দান্ত কাজ করে, এবং মনে রাখবেন যে ডানবারবার বাটন আইটেমগুলির জন্য স্পেসার অবশ্যই অ্যারেতে প্রথম আইটেম হতে হবে যদি আপনি ডান মার্জিনটি পরিবর্তন করতে চান
লিওনাক

4
আইফোন 6 এর জন্য সি সি এক্স, -16 মার্জিনটি কাজ করছে বলে মনে হচ্ছে না। -20 ঠিক বলে মনে হচ্ছে .. কোনও আইডিয়া কীভাবে আমরা সমস্ত আইফোন ডিভাইস জুড়ে এই কাজটি সূক্ষ্ম করতে পারি?
ভিগনেশ পিটি

4
আইওএস 13 এর জন্য কাজ করছেন না! আইওএস 13 এ কীভাবে অর্জন করা যায় তা কি কেউ জানেন?
নিকু

23

@ সি_এক্স তার উত্তরের উপর ভিত্তি করে আমি একটি বিভাগ তৈরি করেছি যা বর্তমান ডিভাইসের আইওএস সংস্করণের উপর ভিত্তি করে ইউআইবারবারটন আইটেম যুক্ত এবং অবস্থান করে।

// 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

আপনার দৃশ্যের নিয়ামক আপনি এখন ব্যবহার করতে পারেন [self.navigationItem addLeftBarButtonItem:leftBarButtonItem];এবং[self.navigationItem addRightBarButtonItem:rightBarButtonItem];

আমি সাবক্লাসিং UIButtonও ওভাররাইড করার চেষ্টা করেছি -alignmentRectInsetsকিন্তু এটি আমাকে মতামতের মধ্যে স্থানান্তরিত করতে সমস্যা দিয়েছে।


10

সুইফট ২.০ এর জন্য, নিম্নলিখিত প্রভাবটি পাওয়ার এটি আমার সমাধান ছিল ...

(আপনার পরিস্থিতির উপর নির্ভর করে প্রকৃত মান আলাদা হতে পারে)

এখানে চিত্র বর্ণনা লিখুন

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)

সুইফট ২.২ আপডেট:

সুইফট ২.২-এর জন্য, action: Selectorপদ্ধতিটি পরিবর্তিত হয়েছে এবং নীচে টাইপ করা উচিত

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


9

এটি এর জন্য আমার সমাধান Swift 3.0:

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

6

এই বাগটি ঠিক করতে, আপনাকে অবশ্যই সাবক্লাস করতে হবে UIButtonযাতে আপনি ওভাররাইড করতে পারেন alignmentRectInsets। আমার পরীক্ষা থেকে, আপনাকে UIEdgeInsetsবোতামের অবস্থার উপর নির্ভর করে একটি ইতিবাচক ডান অফসেট বা একটি ইতিবাচক বাম অফসেট দিয়ে একটি ফিরিয়ে দিতে হবে । এই সংখ্যাগুলি আমার কাছে কোনও ধারণা দেয় না (তাদের মধ্যে কমপক্ষে একটি নেতিবাচক হওয়া উচিত, সাধারণ জ্ঞান অনুসারে), তবে এটি আসলে কাজ করে:

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

আমি সামঞ্জস্য করার চেষ্টা করার পরামর্শ দেওয়ার জন্য @ জেভকে বিশেষ ধন্যবাদ alignmentRectInsets


উত্তর করার জন্য ধন্যবাদ. যদিও এটি একটি ভাল সমাধান তবে আমি @ সি_এক্স উত্তরটিকে পছন্দ করেছি কারণ এখনই আমি সাব-ক্লাসিং এড়ানোর চেষ্টা করছি ..
সালমান জায়েদী

এটি আইওএস in-এ অ্যানিমেশন চলাকালীন বোতামগুলি কিছু বিশিষ্ট স্থানান্তরিত করেছিল, এনিমেশন শেষ হওয়ার পরে সেগুলি ভুল জায়গায় শুরু হবে এবং ইনসেটগুলি মেলে শিফট করবে।
ক্রিস ওয়াগনার 21

আমি অবাক হই না। উপরের কোডটি কেবল আইওএস 7 বিল্ডগুলির জন্য একটি আইওএস 6 স্টাইলের লেআউট পেতে প্রয়োজন।
jaredsinclair

কুইক ফিক্স, চমৎকার কাজ। তবে আইওএস 9 এর জন্য, আপনাকে যেগুলি সেট করা নেই সেগুলি ফিরিয়ে আনতে হবে:
এ-মাজেদ

5

স্মিগের সীসা অনুসরণ করে আমি একটি বিভাগ তৈরি করেছিলাম তবে ফরোয়ার্ডের চেয়ে পিছনের সামঞ্জস্যতা দিতে এটি সংশোধন করেছিলাম। আমি কীভাবে এটি আইওএস 7 এ চাই তা কাজ করার জন্য আমি সবকিছু সেটআপ করি এবং তারপরে ব্যবহারকারী যদি কিছু কম চালায় তবে আমি জিনিসগুলি নিয়ে চটকা শুরু করি।

@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

এবং তারপরে বিশ্বব্যাপী এটি পেতে, আমার কাছে একটি পাতলা UIViewControllerসাবক্লাস রয়েছে যা আমার দর্শনের সমস্ত নিয়ামকরা উত্তরাধিকার সূত্রে পেয়েছে।

@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

আমি বুঝতে পেরেছি যে আমি ওএস সংস্করণটি দুবার পরীক্ষা করে নিচ্ছি (একবারে INFViewControllerআবার একবারে বিভাগে), প্রজেক্টের যে কোনও জায়গাতেই আমি এটি ওয়ান-অফ হিসাবে ব্যবহার করতে চাইছি তবে বিভাগে রেখে এসেছি।


5

দ্রুত জন্য আপনি এটি করতে পারেন

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
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
                }
            }

4
এই পদ্ধতিটি বিলম্বের সাথে ডাকা হয়
ওরিয়াম 11'19

এটি করার সঠিক সমাধান, আইওএস 11 থেকে নেতিবাচক স্থান কাজ করবে না
রফিকুল হাসান

4

সুইফট 3:

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

2

সুইফট ৩.১

বাম বার বোতাম আইটেম নেতিবাচক স্থান দিতে:

    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) 


1

নেগেটিভ স্পেস iOS 11 থেকে কাজ করবে না

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

উপরের কোডটি উভয় দিকের বামবারবারটন আইটেম এবং রাইটবারবারটন আইটেম থেকে মার্জিন সরিয়ে ফেলবে। আপনার যদি অতিরিক্ত মার্জিন যুক্ত করতে হয় (মার্জিন অপসারণের পরে) নিম্নলিখিত কোড যুক্ত করুন

    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]

4
'ব্যক্তিগত ভিউয়ের লেআউট
মার্জিনটি

0

আমি বিশ্বাস করি আপনাকে একটি UIButtonসাবক্লাসের সাথে কাস্টম বোতামটি ব্যবহার করতে হবে এবং আপনার সাবক্লাসে ওভাররাইড করতে হবে -alignmentRectInsets। এটি সঠিকভাবে স্থানান্তরিত করার জন্য আপনার উপযুক্ত প্রান্তের জন্য ধনাত্মক বা নেতিবাচক মান দরকার কিনা তা আমি ভুলে গিয়েছি, তবে যদি কোনওটি কাজ না করে তবে অন্যটি চেষ্টা করে দেখুন।


0

আমার জন্য কাজ

ডানবার্ট বাটন কাস্টমভিউ?? ট্রান্সফর্ম = সিজিএফাইন ট্রান্সফর্ম (অনুবাদ এক্স: 10, y: 0)


-1

সুন্দর সিদ্ধান্ত, অনেক অনেক ধন্যবাদ! আমার নেভিগেশন শিরোনামের বাম দিকে মাত্র দুটি উপাদান যুক্ত করা দরকার। এটি আমার সমাধান:

  // Settings Button
  // This trick correct spacing between two left buttons
  UIBarButtonItem *settingsButtonItem = [[UIBarButtonItem alloc] init];
  UIView *settingsButtonItemView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 22.0, 22.0)];
  settingsButtonItem.customView = settingsButtonItemView;
  UIButton *settingsButton = [UIButton buttonWithType:UIButtonTypeSystem];
  settingsButton.frame = settingsButtonItemView.frame;
  [settingsButton setImage:[UIImage imageNamed:@"settings"] forState:UIControlStateNormal];
  settingsButton.tintColor = [[[[UIApplication sharedApplication] delegate] window] tintColor];
  [settingsButton addTarget:self action:@selector(showSettings:) forControlEvents:UIControlEventTouchDown];
  [settingsButtonItemView addSubview:settingsButton];

  // Star Button
  UIBarButtonItem *starButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"star_gray"] style:UIBarButtonItemStyleBordered target:self action:@selector(showStarred)];
  starButtonItem.width = 22.0;
  NSLog(@"%f", starButtonItem.width);

  // Negative Spacer
  // It shifts star button to the left
  UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
  negativeSpacer.width = -10.0;

  NSArray *leftNavigtaionBarButtonItems = @[negativeSpacer, starButtonItem, settingsButtonItem];
  [self.navigationItem setLeftBarButtonItems:leftNavigtaionBarButtonItems];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.