1

私のデバイスの UISwitch: 下のピクセルが切り取られたスイッチ画像 http://gorgando.com/uiswitch.jpg

シミュレーターの UISwitch: 良い UISwitch http://gorgando.com/uiswitch-good.png

ご覧のとおり、デバイスでは下のピクセルが切り取られていますが、シミュレータでは切り取られていません。考えられることはすべて試しましたが、問題は解決しませんでした。

私が試したことのいくつか:

  • UISwitch のフレームの高さを変更する
  • UICell の高さの変更
  • UICell の contentView の高さを変更する
  • UICell の contentView ではなく、UICell に UISwitch を追加する

関連するコードは次のとおりです。
これは、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 が問題かもしれないと思ったので、これらの UISwitches を通常の UIView に追加して、それらがどのように見えるかを確認しました。シミュレーターで問題なく表示され、デバイスで底が切り刻まれるというまったく同じ問題があります。とても奇妙です!

4

3 に答える 3

3

UISwitch をプログラムで作成し、そのフレームの原点を変更するときに同じ問題が発生しました。これは、ハーフピクセルの問題であることが判明しました。

ハーフ ピクセルのバグに気付くための鍵は、不要なアーティファクトがシミュレーターとデバイスで異なって表示されるかどうかです。

Interface Builder を使用して UISwitch を配置するソリューションはこれを修正します。UISwitch のフレームの原点 x/y を設定している場合は、新しい座標を floor() にすることもできます。

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 を grep して ".5" 座標を探すことです。Interface Builder で UI 要素の配置を微調整しすぎると、このバグが発生することがあります。

于 2010-07-06T22:20:40.173 に答える
2

これは、UISwich のトップが原因です。を使用UISwich.origin.y = ceil((height - UISwich.size.height)/2) して修正できます。

于 2011-06-02T07:05:07.227 に答える
1

何が間違っているのか正確にはわかりませんでしたが、最終的に IB で UISwitches を作成し、そのように美しく動作するようにしました。基本的にまったく同じことをしているときに、プログラムではなくIBで機能するのは非常に奇妙です。

于 2010-06-28T15:43:51.227 に答える