2010-06-01 2 views
41

Я сделал custom UISwitch (from this post). Но проблема в том, что мои пользовательские тексты немного длинны. Есть ли способ изменить размер переключателя? [Я пытался setBounds, не работает]Как изменить размер UISwitch?

Edit:

Вот код, который я использовал:

@interface CustomUISwitch : UISwitch  
- (void) setLeftLabelText: (NSString *) labelText; 
- (void) setRightLabelText: (NSString *) labelText;  
@end 

@implementation CustomUISwitch 

- (UIView *) slider 
{ 
    return [[self subviews] lastObject]; 
} 
- (UIView *) textHolder 
{ 
    return [[[self slider] subviews] objectAtIndex:2]; 
} 
- (UILabel *) leftLabel 
{ 
    return [[[self textHolder] subviews] objectAtIndex:0]; 
} 
- (UILabel *) rightLabel 
{ 
    return [[[self textHolder] subviews] objectAtIndex:1]; 
} 
- (void) setLeftLabelText: (NSString *) labelText 
{ 
    [[self leftLabel] setText:labelText]; 
} 
- (void) setRightLabelText: (NSString *) labelText 
{ 
    [[self rightLabel] setText:labelText]; 
} 
@end 

mySwitch = [[CustomUISwitch alloc] initWithFrame:CGRectZero]; 

//Tried these, but did not work 
//CGRect aFrame = mySwitch.frame; 
//aFrame.size.width = 200; 
//aFrame.size.height = 100; 
//mySwitch.frame = aFrame; 

[mySwitch setLeftLabelText: @"longValue1"]; 
[mySwitch setRightLabelText: @"longValue2"]; 
+0

Вы используете UISwitch (от объекта съемки) или UICustomSwitch (с Вашей ссылки)? [Класс UICustomSwitch] (http://www.catamount.com/blog/?p=1063) на самом деле является UISlider. – progrmr

+0

, но он наследует UISwitch, как он может быть слайдером? – mshsayem

+0

UICustomSwitch наследует UISlider. Какой из них вы используете? Ваш код говорит CustomUISwitch, ваш вопрос говорит UISwitch, но ссылка, которую вы указали, на реализацию UICustomSwitch? Мы не можем ответить на ваш вопрос очень хорошо, если вы не скажете, какой из 3 вы действительно имели в виду! – progrmr

ответ

162

Самый простой способ изменить его размер, как вид:

UISwitch *mySwitch = [[UISwitch alloc] init]; 
mySwitch.transform = CGAffineTransformMakeScale(0.75, 0.75); 

и вам не нужно заботиться ни о чем другом!

+4

Это самое простое и чистое решение! +1 –

+0

Не работает? – KaiserJohaan

+1

Проблема в том, что, когда мы делаем это, он пикселирует переключатель ... Любой другой способ? – TheTiger

7

Многие элементы управления предназначены для определенного размера. Если вы выполняете это самостоятельно, вы должны переопределить setFrame:, отрегулируйте параметр кадра в соответствии с требуемым размером вашего элемента управления, а затем передайте его на [super setFrame:].

Если вы подклассифицируете элемент управления с таким поведением, его невозможно переопределить, потому что ваш подкласс будет наследовать реализацию суперкласса setFrame:, который изменяет ваш прямоугольник рамки. И нет возможности установить рамку вашего управления, не вызывая [super setFrame:].

Вы, скорее всего, должны унаследовать от UIControl и реализовать свойства/поведения, которые вы хотите от UISwitch вручную, чтобы обойти это.

+0

Я так думал ... – mshsayem

+1

Подтверждено. Пошел в UISwitch.h ... он имеет этот комментарий в initWithFrame: «// Этот класс обеспечивает размер, подходящий для элемента управления. Размер кадра игнорируется». – mshsayem

3

UISwitch не предназначен для настройки.

Я думаю, что ваше лучшее решение - загрузить одну из пользовательских реализаций коммутатора, упомянутых в другом вопросе, о котором вы говорили. Либо UICustomSwitch, либо RCSwitch. Они оба должны иметь возможность обрабатывать широкие этикетки.

+0

Я использовал UICustomSwitch здесь ... но не могу изменить его размер ... длинные ярлыки становятся обернутыми .. RCSwitch works .. thanks – mshsayem

3

Там нет опции для изменения размера uiswitch в XIb, поэтому необходимо создать и изменить его размер в классе контроллера,

 UISwitch *onoff = [[UISwitch alloc] initWithFrame: CGRectMake(0, 0, 10, 10)]; 
    onoff.transform = CGAffineTransformMakeScale(0.50, 0.50); 
    [self.view addSubview:onoff]; 
1

Вот решение в коде:

UISwitch *mySwitchNewsletter = [[UISwitch alloc] initWithFrame: CGRectMake(varSettingsSwitchNewsletter_x, 
                      varSettingsSwitchNewsletter_y, 
                      varSettingsSwitchNewsletter_width, 
                      varSettingsSwitchNewsletter_height)]; 
if (mySwitchNewsletter != nil) { 

    [varCommerceSettingsView addSubview:mySwitchNewsletter]; 


    float mySwitchScaleFactor = (varSettingsSwitchNewsletter_scale/100.0); 


    CGFloat dX=mySwitchNewsletter.bounds.size.width/2, dY=mySwitchNewsletter.bounds.size.height/2; 
    mySwitchNewsletter.transform = CGAffineTransformTranslate(CGAffineTransformScale(CGAffineTransformMakeTranslation(-dX, -dY), mySwitchScaleFactor, mySwitchScaleFactor), dX, dY); 

    mySwitchNewsletter release]; 
} 

Где varSettingsSwitchNewsletter_scale является int от 0 до 100 (%).

2

Если вы хотите изменить размер переключатель поставить через раскадровки или перо, Вы можете создать подкласс UISwitch и переопределить метод awakeFromNib:

- (void)awakeFromNib { 
    self.transform = CGAffineTransformMakeScale(0.75, 0.75); 
} 

Выберите элемент управления переключатель и изменить его класс в пользовательский класс переключателя.

enter image description here

0
// Just in case someone trying to hard code UISwitch in Xcode 6.4 the following is working 
// in .h 
@property UISwitch * onoff; 

// in .m 

self.onoff = [[UISwitch alloc] initWithFrame:CGRectMake(160, 40, 0, 0)]; 
_onoff.transform = CGAffineTransformMakeScale(0.50, 0.50); 
[self.view addSubview:self.onoff]; 
11

Вот скор 3 версия MXG ответ:

let mySwitch = UISwitch() 
mySwitch.transform = CGAffineTransform(scaleX: 0.75, y: 0.75) 
Смежные вопросы