7

I have a custom UITableViewCell which contains several UIButtons. Each button's frame position is relative to the cell width. I set autoresizingMask=UIViewAutoresizingFlexibleWidth so it will adjust the cell width and the button positions properly when the application starts with the device either in landscape or portrait mode.

The issue is when the device is rotated from one mode to the other, the buttons do not adjust positions because the UITableViewCell is reusable. In other words, the cell is not initialized based on the new UITalbeView width because the cell's function initWithStyle is called before the device is rotated and is not called again after the device rotation. Any suggestions?

4

6 に答える 6

7

何時間もの調査 (このサイトへの投稿を含む) を行った後、解決策が見つかりませんでした。しかし、電球が突然点灯します。解決策は非常に簡単です。デバイスの向きが横向きか縦向きかを検出し、それぞれに異なる名前で 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];
于 2010-03-19T14:14:42.393 に答える
6

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

于 2010-12-19T20:23:27.310 に答える
2

チェックされた答えは、古いiOSバージョンの魅力のように機能します。iOS 6.0の場合、次のコードを使用しました。

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier];
于 2013-03-07T14:17:14.813 に答える
1

メソッド内でセル フレームの幅を修正する必要があります (縦モードと横モードで高さが同じであると仮定します) 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);
 ...
}
于 2010-12-26T17:54:16.190 に答える
0

同様の問題があり、この投稿が役に立ちました。私の場合、別のファイルで宣言されたカスタム クラスがあり、このファイルには次のコードがあります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これで、メソッドに触れる必要はありません。

于 2012-03-14T00:33:24.527 に答える