2015-08-12 1 views
0

Я хотел был бы иметь возможность перемещать кнопки в 2 измерениях не только на горизонтальной оси, но и решение только для одного было бы высоко оценено.Изменение расстояния/положения кнопки навигационной панели в ios 7+

Я видел много ответов на этот вопрос, но никто из них не работал, по крайней мере, не на ios 7+. Использование UIView и размещение кнопки внутри изменяет сенсорную область:

var rightMoreBarButtonItem = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton 
    var rightMoreBarButtonImage = UIImage(named: "ic_more_22px") 
    rightMoreBarButtonItem.setBackgroundImage(rightMoreBarButtonImage, forState: UIControlState.Normal) 
    rightMoreBarButtonItem.addTarget(self, action: "moreTapped", forControlEvents: UIControlEvents.TouchUpInside) 
    rightMoreBarButtonItem.frame = CGRectMake(0, 0, 22, 22) 
    var barButton1View: UIView = UIView(frame: CGRectMake(0, 0, 22, 22)) 
    barButton1View.bounds = CGRectOffset(barButton1View.bounds, -14, -7) 
    barButton1View.addSubview(rightMoreBarButtonItem) 
    var RightMoreBarButtonItem: UIBarButtonItem = UIBarButtonItem(customView: barButton1View) 
    self.navigationItem.rightBarButtonItem = RightMoreBarButtonItem 

Использование fixedSpace работает только для первого места для rightBarButtonItem:

var space1:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil) 
    space1.width = -16.0 

    var space2:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FixedSpace, target: nil, action: nil) 
    space2.width = 0.0 

    self.navigationItem.setRightBarButtonItems([space1, rightMoreBarButtonItem, space2, rightAddBarButtonItem ], animated: true) 

Я попытался изменить значения для пространстве1, space2 без везения. Я потратил много времени, пытаясь понять это, но я новичок в Swift/Obj-C, и у меня нет решений.

ответ

0

Вы должны использовать «разделители»

(ДА, это ObjC, я постараюсь придумать Свифт решения, но единственное изменение, которое вы будете делать это, чтобы создать UIBarButtonItems с помощью этого "UIBarButtonSystemItemFlexibleSpace"

Например, это:

_invitePlaceHolderForExampleBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"some_image"] style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)]; 
_homePlaceHolderForExampleBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"some_image"] style:UIBarButtonItemStylePlain target:self action:@selector(doSomethingMore)]; 

[[self navigationItem] setRightBarButtonItems:[[NSArray alloc] initWithObjects:_invitePlaceHolderForExampleBarButtonItem, _homePlaceHolderForExampleBarButtonItem, nil]]; 

Производит это:

enter image description here

Ну, что было очевидно, верно?

Теперь посмотрим на это с 1 SPACER:

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 

_invitePlaceHolderForExampleBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"some_image"] style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)]; 
_homePlaceHolderForExampleBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"some_image"] style:UIBarButtonItemStylePlain target:self action:@selector(doSomethingMore)]; 

[[self navigationItem] setRightBarButtonItems:[[NSArray alloc] initWithObjects:_invitePlaceHolderForExampleBarButtonItem, spacer,_homePlaceHolderForExampleBarButtonItem, nil]]; 

производит это:

enter image description here

И он производит этот ХИТ площадь:

enter image description here

Вы заметите, очень-очень тонкие линии, показывают хит площадь в UIBarButtonItems и они так же, как они должны быть

Теперь рассмотрим это с 3 Распорки:

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; 

_invitePlaceHolderForExampleBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"some_image"] style:UIBarButtonItemStylePlain target:self action:@selector(doSomething)]; 
_homePlaceHolderForExampleBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"some_image"] style:UIBarButtonItemStylePlain target:self action:@selector(doSomethingMore)]; 

[[self navigationItem] setRightBarButtonItems:[[NSArray alloc] initWithObjects:spacer, _invitePlaceHolderForExampleBarButtonItem, spacer,_homePlaceHolderForExampleBarButtonItem, spacer, nil]]; 

Производит это:

enter image description here

И он производит этот ХИТ область:

enter image description here

Просто используйте различные проставки и что нет, и прекратить вмешательство в попытке заставить UIView в навигационной панели. Почти все, что похоже на то, что Apple не может сделать, это то, что Apple уже делает. Это проблема документации, и Apple могла бы лучше понять, как разработчики, а не разработчики пытаются взломать решение, но я отвлекся, это будет работать, просто используйте то, что у вас уже есть перед вами.

Это работает:

import UIKit 

class DetailViewController: UIViewController { 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     self.title = "Example" 

     var img = UIImage(named: "thw") 
     var space1:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil) 
     space1.width = 50 
     var b = UIBarButtonItem(image: img, style: .Plain, target: self, action: "sayHello") 
     var a = UIBarButtonItem(image: img, style: .Plain, target: self, action: "sayHello") 
     self.navigationItem.setRightBarButtonItems([b, space1, a], animated: true) 
    } 

    func sayHello() { 
     println("got here") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.view?.backgroundColor = UIColor .redColor() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

производит этот выход, без подклассов:

enter image description here

Вы собираетесь придется возиться с прокладками, чтобы сделать эту работу, но это работает. У меня больше нет ответов для вас, вам просто нужно будет настроить его здесь и там, но из примера, который я вам показывал раньше, вы используете разделители с фиксированной шириной, я не использовал фиксированную ширину, даже когда я просто определил те, что были в быстром примере, как гибкие, это имеет значение? Я не знаю, но он работал, не меняя названия.

+0

Я играл с 'UIBarButtonSystemItemFlexibleSpace', но проблема в том, что [название навигационной панели не исправлено] (http://postimg.org/image/iuw54uufh/) и попадает влево, в то время как мой 3 кнопки распределяются равномерно по оставшемуся расстоянию –

+0

Да, но мой заголовок остается фиксированным, я могу показать, что это работает, но решения очень длинные, он не требует ничего большего, чем подклассификация подкласса UIViewController, пусть я знаю, если это то, что вы хотите, потому что это решение довольно интенсивно, но поэтому мой заголовок не двигается – Loxx

+0

, что было бы здорово. –

Смежные вопросы