3

レイヤーからカスタム ボタンを作成しました。でたくさんのレイヤーを作成しますinit。それらを変更*するまで、すべてが期待どおりに機能します。問題が発生するのは実際のデバイスのみであり、シミュレーターではコードが期待どおりに動作します。

needsDisplay と needsLayout を に設定して、レイヤーを強制的にレンダリングしようとしましたYES

-(void) setBackgroundColor:(UIColor *)backgroundColor
{   
    //return; // if I return here, the button gets initialized with it's default royal blue color.  This works correctly on the simulator and device

    [primaryBackground setColors: [NSArray arrayWithObject:(id)backgroundColor.CGColor]];

    //return; //if I return here, primaryBackground will display a clear background on the device, but will display CGColor on the simulator.

    CALayer* ll = [CALayer layer];
    ll.frame=self.frame;
    ll.cornerRadius=primaryBackground.cornerRadius;
    [ll setBackgroundColor:backgroundColor.CGColor];
    [primaryBackground addSublayer:ll];

     //if I return here, primaryBackground will display the "expected" results on both platforms.  IE: it dispalys the new layer, but not it's background color.
}

シミュレーター

シミュレーターのスクリーンショット

デバイス

デバイスのスクリーンショット

テスト

iOS 5.1 と 4.2 でテストしましたが、結果は同じでした。シミュレーターのバージョン 4.1、4.2、および 5.1 で同じように動作するようです

4

1 に答える 1

0

あなたのコードには少なくとも 2 つの問題があります。

  1. 古いレイヤーを削除せずに、色が変更されるたびに新しいレイヤーを追加しています。最初に、以前に作成したサブレイヤーを削除します (または、新しいサブレイヤーを作成して追加せずに単に色を変更します)。のデフォルトopaqueプロパティCALayerが に設定されNOていることに注意してください。これは、他のすべてのサブレイヤーとブレンドされていることを意味します。

    とにかく別のサブレイヤーを追加するのはなぜですか? コードでは、完全にカバーprimaryBackgroundします。setBackgroundColor:次のように機能することはできません。

    - (void)setBackgroundColor:(UIColor *)backgroundColor { 
        [primaryBackground setBackgroundColor:backgroundColor.CGColor];
    }
    

    ?

  2. llしかし、本当に追加のレイヤーが必要な場合は、 を(ではなく) に設定frameする必要があります。である必要があります。また、メソッドをオーバーライドして、背景レイヤーの をルート レイヤーの境界に再度設定する必要があります。boundssuperlayerframell.frame = self.bounds- (void)layoutSubivewsframe

iPhone Simulatorでは、物事は異なるサブシステムによってレンダリングされ、実際のデバイスよりもはるかに高速であることに注意してください。また、一部のフレーム計算が重複する場合があります。

于 2012-09-15T01:53:17.320 に答える