2015-03-14 8 views
2

Я пытаюсь использовать UISwitch в своем UINavigationBar. Я хочу меньший переключатель, чем по умолчанию, поэтому я масштабирую размер до anonymousSwitch.transform = CGAffineTransformMakeScale(0.55, 0.55); Когда я это делаю, переключатель сжимается, но я не могу понять, как выровнять его по вертикали с другими элементами в моем UINavigationBar. Вот как это выглядит в настоящее время: enter image description hereiOS - Изменение размера UISwitch в UINavigationBar

В идеале UISwitch бы на расстоянии от 175 UILabel столько, сколько X UIButton отстоит от 175 UILabel и UISwitch бы по прямой линии с остальные элементы в UINavigationBar. Я пробовал делать switch.center = CGPointMake(switch.center.x, shareButton.center.y), но это не повлияло на размещение UISwitch. Есть ли какой-либо способ для меня переключаться, как я хочу?

+0

При использовании 'transform', я бы посоветовал не использовать а.е. tolayout с ним. Ограничения не очень хорошо сочетаются с 'transform'. Удалите все ограничения, затем измените «center». – Sulthan

ответ

0

Вы пробовали перемещения переключателя с другой метод преобразования, как,

CGAffineTransformMakeTranslation(xValue, yValue); 

также вы можете объединить два преобразования вместе и дать, что преобразование для переключения, как,

CGAffineTransform scale= CGAffineTransformMakeScale(0.55, 0.55); 

CGAffineTransform translate = CGAffineTransformMakeTranslation(0, 10); 

anonymousSwitch.transform = CGAffineTransformConcat(scale, translate); 
+0

Трансформация ничего не делает. – rfj001

1

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

Прежде всего, необходимо создать подкласс UISwitch так:

@interface UICustomSwitch : UISwitch 

@property (assign, nonatomic) CGFloat scale; 

@end 

@implementation UICustomSwitch 

- (void)setFrame:(CGRect)frame { 
    CGFloat superview_height = self.superview.frame.size.height; 
    frame.origin.y = (superview_height - frame.size.height * _scale)/2; 
    [super setFrame:frame]; 
} 

@end 

Второе, что нужно сделать, это создать и настроить ваш UICustomSwitch так:

UICustomSwitch* switch = [UICustomSwitch new]; 
switch.transform = CGAffineTransformMakeScale(0.75, 0.75); 
switch.scale = 0.75; 
UIBarButtonItem* button = [[UIBarButtonItem alloc] initWithCustomView:switch]; 

Чтобы создать больше пространства между 175 и переключатель вы могли бы просто добавить еще UIBarButtonItem между 175 и коммутатором. Например. фиксированная проставка с определенной шириной.

Как я уже сказал, я не думаю, что это безупречное решение.
В моих тестах это сработало.

Другое решение по 0yeoj (но немного скорректирована -> всегда сосредоточены на любой высоте Панель навигации, для панелей инструментов это то же самое, просто использовать self.navigationController.toolbar.frame.size.height):

UIView* switch_container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, self.navigationController.navigationBar.frame.size.height)]; 

UISwitch* switch = [[UISwitch alloc] initWithFrame:switch_container.bounds]; 
switch.transform = CGAffineTransformMakeScale(0.75, 0.75); 
switch.center = CGPointMake(switch_container.bounds.size.width/2, switch_container.bounds.size.height/2); 
[switch addTarget:self action:@selector(action:) forControlEvents:UIControlEventValueChanged]; 
[switch_container addSubview:switch]; 

UIBarButtonItem* button = [[UIBarButtonItem alloc] initWithCustomView:switch_container]; 

self.navigationItem.rightBarButtonItem = button; 
0

Это код я тестировал ..

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    UIButton *xbutton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    xbutton.frame = CGRectMake(0, 6, 35, 35); 
    xbutton.backgroundColor = [UIColor redColor]; 

    UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)]; 

    UISwitch *switchButton = [[UISwitch alloc] init]; 
    switchButton.frame = CGRectMake(0, 0, 35, 35); 
    switchButton.transform = CGAffineTransformMakeScale(0.55, 0.55); 
    switchButton.center = CGPointMake(containerView.frame.size.width/2, containerView.frame.size.height/2); 
    [containerView addSubview:switchButton]; 

    UIBarButtonItem *additionalButton = [[UIBarButtonItem alloc] initWithCustomView:containerView]; 

    UIBarButtonItem *xBarButton = [[UIBarButtonItem alloc] initWithCustomView:xbutton]; 

    //rearrange it if necessary 
    NSArray *arrayButton = [NSArray arrayWithObjects: xBarButton, additionalButton, nil]; 

    self.navigationItem.leftBarButtonItems = arrayButton; 
}. 

хмм ... я еще не понижена до Йосемити, так что я не имею ios8.3 здесь этот код работает отлично, хотя для меня ..

+0

Ваше решение не работает для меня. Вы проверили это? Протестировано на iPhone 6, iOS 8.3. То, как я это сделал, действительно работает. –

+0

На iOS 8.2 на самом деле .. и да, я только что попробовал .. я отредактирую и поместил весь код .. – 0yeoj

+0

неловко. Я запускал его на iPhone 5 (7.1) Simulator только сейчас.Размещена кнопка с моим решением и одна с вашей на панели инструментов/навигационной панели, и ваша кнопка не имеет вертикальной ориентации. Не спрашивайте меня, почему, я точно использовал ваш код. –

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