1

設定パネルとして機能するスライドアウト UIView があります。ビューには、その中にテーブル ビュー コントローラーを含むコンテナーがあります。テーブル ビュー自体には、さまざまなオプションを表す静的セルの約 6 つのグループがあります。各セルにはいくつかの UIButton があり、グループによって動作が異なります。各グループのボタンの描画を処理する別のカスタム UIView サブクラスを作成しました。このパネルが最初にロードされると、各グループのボタンの辞書の辞書と、各グループのカスタム ビューの辞書の辞書 (キー パスが一致するもの) を作成します。

問題は、カスタム ビューがパネルの上部にしか並んでいないように見えることです。パネルの一番下までスクロールすると、ボタン ビューが並んでいません。私の人生では、これを理解することはできないようです。パネルの写真は次のとおりです。

パネルの上部 (期待どおりに動作) パネルの下部 (悪いことが起こっています)

パネルがロードされたときに設定を初期化してカスタムサブビューをレイアウトするために使用しているコードは次のとおりです(設定パネルのテーブルビューコントローラークラスで):

- (void)initializeSettings
    {
        self.buttonStates = nil; // A dictionary of dictionaries with all button states within the panel
        self.buttonViews = nil;  // A dictionary of dictionaries with all button views (same keyPaths as self.buttonStates).
        NSMutableDictionary *buttonStates = [[NSMutableDictionary alloc] init];
        NSMutableDictionary *buttonViews = [[NSMutableDictionary alloc] init];
        NSArray *btnGroupNames = [self btnGroupNames]; // Array of button group names.
        NSArray *btnArrays = [self btnArrays]; // An array of arrays with all buttons.
        for(int i = 0; i < [btnArrays count]; i++){
            NSArray *outerArray = [btnArrays objectAtIndex: i];
            NSString *outerKey = [btnGroupNames objectAtIndex: i];
            NSMutableDictionary *innerDicV = [[NSMutableDictionary alloc] init];
            NSMutableDictionary *innerDicS = [[NSMutableDictionary alloc] init];
            for(UIButton *btn in outerArray){
                NSString *innerKey = [btn.titleLabel.text stringByReplacingOccurrencesOfString:@" " withString:@""];
                ButtonSelectionView *bsv  = [[ButtonSelectionView alloc] initWithFrame: btn.frame];
                bsv.alpha = 0.0;
                bsv.opaque = NO;
                [[btn superview] addSubview: bsv];
                [[btn superview] bringSubviewToFront: btn];
                [innerDicV addEntriesFromDictionary: @{ innerKey : bsv }];
                [innerDicS addEntriesFromDictionary: @{ innerKey : NOT_SELECTED }];
            }
            [buttonViews setValue: innerDicV forKey: outerKey];
            [buttonStates setValue: innerDicS forKey: outerKey];
        }
        self.buttonViews = buttonViews;
        self.buttonStates = buttonStates;
        self.previousButtonStates = nil;
        self.settingsLoaded = YES;
    }

補足: 辞書は遅延インスタンス化されます。また、viewDidLoad、viewDidAppear、およびviewDidLayoutSubviewsからこの関数を呼び出してみましたが、役に立ちませんでした。どんな提案でも大歓迎です、ありがとう!

4

1 に答える 1

0

わかりました、私もこれを理解しました。既に IB のボタンにアウトレットを配線していたので、UIButton のフレーム プロパティへのアクティブな参照を常に持っていることに気付きました。初期化/アニメーションの時点で、カスタム ビューのフレームを現在のボタン フレームにリセットする必要がありました。そこで、上記のコードを変更して、他の 2 つの辞書と同じキーパスで各ボタンを参照する 3 つ目の NSDictionary を追加しました。次に、カスタム UIView を変更/表示する必要があるときに、フレーム値のその辞書のボタンを参照しました。

- (void)initializeSettings
    {
        self.buttonStates = nil; // A dictionary of dictionaries with all button states within the panel
        self.buttonViews = nil;  // A dictionary of dictionaries with all button views (same keyPaths as self.buttonStates).
        NSMutableDictionary *buttonStates = [[NSMutableDictionary alloc] init];
        NSMutableDictionary *buttonViews = [[NSMutableDictionary alloc] init];
        NSMutableDictionary *buttons = [[NSMutableDictionary alloc] init];
        NSArray *btnGroupNames = [self btnGroupNames];
        NSArray *btnArrays = [self btnArrays];
        for(int i = 0; i < [btnArrays count]; i++){
            NSArray *outerArray = [btnArrays objectAtIndex: i];
            NSString *outerKey = [btnGroupNames objectAtIndex: i];
            NSMutableDictionary *innerDicV = [[NSMutableDictionary alloc] init];
            NSMutableDictionary *innerDicS = [[NSMutableDictionary alloc] init];
            NSMutableDictionary *innerDicB = [[NSMutableDictionary alloc] init];
            for(UIButton *btn in outerArray){
                NSString *innerKey = [btn.titleLabel.text stringByReplacingOccurrencesOfString:@" " withString:@""];
                ButtonSelectionView *bsv  = [[ButtonSelectionView alloc] initWithFrame: btn.frame];
                bsv.alpha = 0.0;
                bsv.opaque = NO;
                [[btn superview] addSubview: bsv];
                [[btn superview] bringSubviewToFront: btn];
                [innerDicV addEntriesFromDictionary: @{ innerKey : bsv }];
                [innerDicS addEntriesFromDictionary: @{ innerKey : NOT_SELECTED }];
                [innerDicB addEntriesFromDictionary: @{ innerKey : btn }];
            }
            [buttonViews setValue: innerDicV forKey: outerKey];
            [buttonStates setValue: innerDicS forKey: outerKey];
            [buttons setValue: innerDicB forKey: outerKey];
        }
        self.buttonViews = buttonViews;
        self.buttonStates = buttonStates;
        self.buttons = buttons;
        self.previousButtonStates = nil;
        self.settingsLoaded = YES;
    }

次に、ボタンがクリックされたときに、「UI の更新」メソッドに次のコード行を追加して、カスタム ボタン選択ビューの位置を変更しました。

bsv.frame = ((UIButton *)[self.buttons valueForKeyPath: keyPath]).frame;

うまくいけば、それが同様の問題を抱えている人を助けるでしょう。ボタンオブジェクトとカスタムビューオブジェクトをviewDidLayoutSubviewsに初期化/保存し、UIを更新するときに同じ方法でそれらを参照することで、プログラムで同じことができると思います。

于 2013-06-06T21:30:16.687 に答える