Нижняя часть UISwitch на устройстве обрезана, но на симуляторе отображается нормально - PullRequest
1 голос
/ 24 июня 2010

Переключатель UIS на моем устройстве: Переключатель изображения с обрезанными нижними пикселями http://gorgando.com/uiswitch.jpg

UISwitch на симуляторе: Good UISwitch http://gorgando.com/uiswitch-good.png

Как видите, нижние пиксели обрезаются на устройстве, а не на симуляторе. Я перепробовал почти все, что мог придумать, но ничто не устранило проблему.

Некоторые вещи, которые я пробовал:

  • Изменение высоты рамки UIS-переключателя
  • Изменение высоты UICell
  • Изменение высоты содержимого UICell
  • Добавление UIS-переключателя в UICell, а не в contentView UICell

Вот соответствующий код:
Это в viewDidLoad uiTableViewController:

UISwitch *sw =  [[UISwitch alloc] init];
self.contactedSwitch = sw;
[sw release];
self.contactedSwitch = [UISwitch switchWithLeftText:@"YES" andRight:@"NO"];
self.contactedSwitch.center = CGPointMake(230, 22);
self.contactedSwitch.on = [self.contact.contacted boolValue];

Вот откуда происходит метод switchWithLeftText: andRight:

#import "UISwitch-Extended.h"

#define TAG_OFFSET  900

@implementation UISwitch (tagged)
- (void) spelunkAndTag: (UIView *) aView withCount:(int *) count
{
    for (UIView *subview in [aView subviews])
    {
        if ([subview isKindOfClass:[UILabel class]])
        {
            *count += 1;
            [subview setTag:(TAG_OFFSET + *count)];
        }
        else 
            [self spelunkAndTag:subview withCount:count];
    }
}

- (UILabel *) label1 
{ 
    return (UILabel *) [self viewWithTag:TAG_OFFSET + 1]; 
}

- (UILabel *) label2 
{ 
    return (UILabel *) [self viewWithTag:TAG_OFFSET + 2]; 
}

+ (UISwitch *) switchWithLeftText: (NSString *) tag1 andRight: (NSString *) tag2
{
    UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectMake(0, 0, 94, 27)];

    int labelCount = 0;
    [switchView spelunkAndTag:switchView withCount:&labelCount];

    if (labelCount == 2)
    {
        [switchView.label1 setText:tag1];
        [switchView.label2 setText:tag2];
    }

    return [switchView autorelease];
}

@end

Здесь я добавляю переключатель UIS в свою ячейку просмотра таблицы:

[[contactedCell contentView] addSubview:self.contactedSwitch];

Большое спасибо!

[Обновить] Я подумал, что проблема может быть в ящике таблицы, поэтому я добавил эти UIS-переключатели в обычный UIView, чтобы посмотреть, как они выглядят. У меня точно такая же проблема, когда они хорошо выглядят в симуляторе, а нижняя часть устройства обрезана. Так странно!

Ответы [ 3 ]

3 голосов
/ 07 июля 2010

У меня была такая же проблема при программном создании UISwitch и изменении источника его фрейма - это оказалось полупиксельной проблемой.

Ключ к обнаружению полупиксельных ошибок заключается в следующем: устранять нежелательные артефактыэто выглядит по-разному на симуляторе против устройства?

Ваше решение размещения UISwitch с Interface Builder исправляет это - вы также можете удостовериться, что укажете () новые координаты, если вы устанавливаете исходное положение фрейма UISwitch x / y.

UISwitch *mySwitch = [[UISwitch alloc] initWithFrame(CGRectZero)];
CGRect switchFrame = mySwitch.frame;  
// move frame up without pixel fractions
switchFrame.origin.y = floor((cell.contentView.frame.size.height - switchFrame.size.height) / 2); 
mySwitch.frame = switchFrame;
[cell.contentView addSubview:mySwitch];

В случае оригинального плаката высота uiswitch является нечетным числом (27 пикселей), поэтому установка центра в 22 делит высоту на 13.5.Координата Y начала координат UISwitch становится 22-13,5 = 8,5 пикселей.Либо не перемещайте UISwitch, устанавливая его центр, либо устанавливайте координату по полу, либо используйте дробь в вызове CGPointMake (230,22.5).

Другой способ отследить этот тип ошибки - выполнить поиск черезИнтерфейсный конструктор ищет координаты ".5".Я обнаружил, что иногда чрезмерная настройка размещения элементов интерфейса в Интерфейсном Разработчике приводит к этой ошибке.

2 голосов
/ 02 июня 2011

Это вызвано вершиной UISwich. Вы можете использовать UISwich.origin.y = ceil((height - UISwich.size.height)/2) чтобы исправить это.

1 голос
/ 28 июня 2010

Никогда не понимал, что именно не так, но в итоге я создал UIS-переключатели в IB и сделал так, чтобы он прекрасно работал.Очень странно, что это работает в IB, а не программно, когда я делаю то же самое.

...