質問

私はいくつかのUIButtonsを含むカスタムUITableViewCellのを持っています。各ボタンのフレーム位置は、セルの幅を基準にしています。アプリケーションは、いずれかの風景やポートレートモードでは、デバイスから始まるとき、それは適切にセル幅とボタンの位置を調整しますので、私はautoresizingMask = UIViewAutoresizingFlexibleWidthを設定します。

問題は、デバイスが他の1つのモードから回転させたときのUITableViewCellは再利用可能であるので、ボタンは位置を調整していないです。デバイスを回転させ、デバイスの回転後に再び呼び出されることはありません前に、細胞の機能initWithStyleが呼び出されるので、他の言葉では、セルが新しいUITalbeView幅に基づいて初期化されていません。任意の提案ですか?

役に立ちましたか?

解決 2

(このサイト内の記事を含む)研究の時間を過ごした後、私は、任意の解決策を見つけることができませんでした。しかし、電球が突然のすべてがオンになります。解決策は非常に簡単です。単にデバイスの向きがランドスケープまたはポートレートモードであるか否かを検出し、それぞれに異なる名前でReusableCellIdentifierを定義します。

static NSString*Identifier;

if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight) {
                Identifier= @"aCell_portrait";
            }
            else Identifier= @"DocumentOptionIdentifier_Landscape";


    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

他のヒント

UITableViewCellのものUIViewであるので、

、あなたはsetFrameメソッドをオーバーライドすることができます。あなたのテーブルビューが回転するたびに、このメソッドはすべてのセルのために呼び出されます。

-(void)setFrame:(CGRect)frame
{
    [super setFrame:frame];

    //Do your rotation stuffs here :)
} 

前の答えは、深刻な問題があります。 デバイスの向きは、インターフェースの向きとは何の関係もありませんので、あなたは、[のUIApplication sharedApplication] .statusBarOrientationの代わりに、[UIDevice currebtDevice] .orientationを使用する必要があります - 。デバイスの向きは、加速度計に基づいて物理的な回転である。

チェックを入れ答えは古いのiOSバージョンでは魔法のように動作します。 iOSの6.0のために私は次のコードを使用します:

static NSString *Identifier;
if (self.interfaceOrientation==UIInterfaceOrientationPortrait) {
    Identifier=@"aCell_portrait";
}
else {
    Identifier=@"DocumentOptionIdentifier_Landscape";
}

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];

あなたはcellForRowAtIndexPathメソッド内(高さは、肖像画や風景モードで同じであると仮定して)あなたの細胞のフレーム幅を修正する必要があります。それはここで働いているものです。私はIBでカスタムTableViewCellを作成するために使用されると、それは常に肖像画320ピクセル幅のために初期化されます。セルがキューから「再利用」されている場合でも、それが期待どおりに動作フレームを定義してます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 ...
 UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
 if (cell == nil) {
    // create cell here...
 }

 // Adjust cell frame width to be equal to tableview frame width
 cell.frame = CGRectMake(0, 0, tableView.frame.size.width, cell.frame.size.height);
 ...
}

私は同様の問題を抱えていたし、この記事が助けてくれました。私の場合は、別のファイルで宣言されたカスタムクラスを持っており、このファイルには、私はlayoutSubviewsに次のコードを持っています:

//PORTRAIT CELL
if ([UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeLeft && 
    [UIDevice currentDevice].orientation!=UIDeviceOrientationLandscapeRight)
{
    //build the custom content views for portrait mode here
}
else
{
    //build the custom content views for landscape mode here
}

そして、私のビューコントローラで、私はちょうどwillAnimateRotationToInterfaceOrientation:を実装して、私のテーブルビューにreloadDataメッセージを送っています。

これで、私はcellForRow法に触れることはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top