1

ユニバーサルアプリにカスタムUITableViewCellがあり、iPhoneとiPadで異なるフレームを設定する必要があり、異なる向きを考慮する必要がありますが、デバイスの向きを認識できません。UIDeviceOrientation間違った場所にありますか?UIDeviceOrientation戻り0ます。これはコードですCustomCell.m

 -(void) layoutCellPortrait{
 if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){

         //......frame subviews iPhone

 }else{

      //........frame subviews Ipad

 }

 }
 -(void) layoutCellLandscape{
     if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){

         //.....frame subviews iPhone

     }else{

        //.......frame subviews Ipad

 }

}


- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
   {

    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];

    if (self) {

    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice]orientation];
    NSLog(@"The orientation is è %d", deviceOrientation);//here return 0

    if(deviceOrientation == UIInterfaceOrientationPortrait || deviceOrientation== UIInterfaceOrientationPortraitUpsideDown) {

         [self layoutCellPortrait];

    }
    else if (deviceOrientation== UIInterfaceOrientationLandscapeRight){
        [self layoutCellLandscape];

    }
    else if (deviceOrientation==UIInterfaceOrientationLandscapeLeft){

        [self layoutCellLandscape];

    }


    [self.contentView addSubview:self.subviews];

}
return self;
 }
4

5 に答える 5

2

reloadDataクラスに回転デリゲートを実装し、回転が発生するたびに、この向きを入力パラメータとしてセルクラスのメソッドを呼び出します(テーブルでa を呼び出していると仮定すると、メソッド内にあるこのメソッドが呼び出されcellForRowAtIndexpathます。これはリセットする必要がありますそれに応じて各回転でフレーム。

アップデート:

ローテーションデリゲートでは、

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration {
  self.interfaceOrientation = orientation;
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
  [self.tableView reloadData];
}

tableViewcellForRowAtIndexPathメソッドでは、

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   static NSString *cellIdentifier = @"cell";
   CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
   if (cell == nil) {
     cell = [[[CustomCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];
   }
  //code..
  [cell rearrangeSubviewsForOrientation:self.interfaceOrientation];

  return cell;
}

あなたのcellクラスでこれを追加してください、

- (void)rearrangeSubviewsForOrientation:(UIInterfaceOrientation)orientation {
    if(UI_USER_INTERFACE_IDIOM()== UIUserInterfaceIdiomPhone){

        //iPhone
        if(orientation == UIInterfaceOrientationPortrait || orientation== UIInterfaceOrientationPortraitUpsideDown) {
            //portait
        } else {
            //landscape
        }

    } else {

        //iPad
        if(orientation == UIInterfaceOrientationPortrait || orientation== UIInterfaceOrientationPortraitUpsideDown) {
            //portait
        } else {
            //landscape
        }
    }
}
于 2012-10-23T08:21:27.670 に答える
2

これを試して

-(void)layoutSubviews{
 --- your code ----
}
  1. デバイスが回転するたびに、このメソッドが呼び出されます。
  2. デバイスが回転したときに実行するコードをブラケット内に記述します

注: これは UITableViewCell のサブクラスであるクラス用です

UIViewController のようなサブクラスであるクラスで方向の変化を検出したい場合は、以下のviewDidLayoutSubviewsと呼ばれる同様のメソッドがあります

- (void)viewDidLayoutSubviews{
 --- your code ---
} 
于 2016-05-25T11:45:28.997 に答える
0

あなたが見る必要がある2つの事柄は次のとおりです:

  1. まず、デバイスが回転してテーブルをリロードしたかどうかを確認します

    -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {[self.tableView reloadData]; }

  2. 次に、-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathで、UIInterfaceOrientationIsLandscape(self.interfaceOrientation)を使用して、必要なレイアウトをロードするためのGUI状態を確認します。

于 2012-10-26T04:26:33.330 に答える
0

実は私も同じことをしたことがあります。最初に、異なる向きの 2 つの UITableViewCell.xib を作成し、viewController で以下のメソッドを実装する必要があります。

customCell.xib ViewController でデバイスの向きを検出する必要はありません。tableView の向きを自動的に管理します。

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{

    if ([[UIDevice currentDevice] userInterfaceIdiom] != UIUserInterfaceIdiomPhone)
    {
        if(self.interfaceOrientation==UIInterfaceOrientationPortrait || self.interfaceOrientation==UIInterfaceOrientationPortraitUpsideDown)
        {


        }
        else
        {


        }
    }
    else
    {

    }
[yourTable reloadData];
}    

次に、あなたの tableView CellForRowAtIndexPath メソッドで以下のコードを実装します

if(self.interfaceOrientation==UIInterfaceOrientationPortrait || self.interfaceOrientation==UIInterfaceOrientationPortraitUpsideDown) 
        {  

            static NSString *CellIdentifier = @"Cell";
            CategoryCell *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier];
            if (cell == nil) {
                cell = [[[CategoryCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier] autorelease];
                cell.autoresizingMask = UIViewAutoresizingFlexibleWidth;

            }
}
else{
            static NSString *CellIdentifier = @"Cell1";
            CategoryCell1 *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier];
            if (cell == nil) {
                cell = [[[CategoryCell1 alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellIdentifier] autorelease];
                cell.autoresizingMask = UIViewAutoresizingFlexibleWidth;
                            }
于 2012-10-23T08:52:16.707 に答える