UISwitch的底部部分在设备上被切断,但在模拟器上显示正常

时间:2010-06-24 19:27:36

标签: iphone uitableview uiview switch-statement uiswitch

我的设备上的UISwitch:Switch Image with the bottom pixels cut off http://gorgando.com/uiswitch.jpg

模拟器上的UISwitch:Good UISwitch http://gorgando.com/uiswitch-good.png

如您所见,底部像素在设备上被切断,但在模拟器上没有。我已经尝试了我能想到的一切,但没有解决问题。

我尝试过的一些事情:

  • 更改UISwitch框架的高度
  • 更改UICell的高度
  • 更改UICell的contentView的高度
  • 将UISwitch添加到UICell而不是UICell的contentView

以下是相关代码:
这是在uiTableViewController的viewDidLoad中:

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

这是我将UISwitch添加到tableviewcell的地方:

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

非常感谢!

[更新] 我认为tableviewcell可能是问题所在,所以我将这些UISwitch添加到常规UIView中以查看它们的外观。我有完全相同的问题,他们在模拟器中看起来没问题,底部被切断在设备中。太奇怪了!

3 个答案:

答案 0 :(得分:3)

当以编程方式创建UISwitch并更改其帧的原点时,我遇到了同样的问题 - 结果是半像素问题。

注意半像素错误的一个关键是:模拟器与设备上的不需要的工件是否有所不同?

使用Interface Builder放置UISwitch的解决方案可以解决这个问题 - 如果您正在设置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。 UISwitch的原点y坐标变为22-13.5 = 8.5像素。要么不通过设置其中心或移动坐标来移动UISwitch,要么在CGPointMake(230,22.5)的调用中使用一小部分。

跟踪此类错误的另一种方法是通过Interface Builder查找“.5”坐标。我发现有时在Interface Builder中过度调整UI元素的位置会引入这个错误。

答案 1 :(得分:2)

这是由UISwich的顶级造成的。 你可以使用UISwich.origin.y = ceil((height - UISwich.size.height)/2) 解决它。

答案 2 :(得分:1)

从来没有弄清楚到底出了什么问题,但我最终在IB中创建了UISwitches并让它以这种方式工作得非常漂亮。非常奇怪它在IB中工作而不是以编程方式工作,当我基本上做同样的事情时。