如何管理UITableViewCell的子类中的旋转

时间:2012-10-23 08:15:15

标签: iphone ios uitableview rotation

我在通用应用程序中有自定义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;
 }

5 个答案:

答案 0 :(得分:2)

在你的类中实现旋转委托,每当轮换发生时,调用单元类中的方法,将此方向作为输入参数(假设您在表上调用reloadData,而后者又调用此方法它位于cellForRowAtIndexpath方法中。这应该在每次旋转时相应地重置帧。

<强>更新

在轮换委托中,

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

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

在tabelView cellForRowAtIndexPath方法中,

- (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
        }
    }
}

答案 1 :(得分:2)

试试这个

-(void)layoutSubviews{
 --- your code ----
}
  1. 每次旋转设备时,都会调用此方法。
  2. 在设备旋转时,在要运行的括号内写入代码
  3. 注意:这是针对UITableViewCell

    的子类的类

    如果你想在类中检测方向变化,这是UIViewController之类的子类,下面有一个名为 viewDidLayoutSubviews 的类似方法

    - (void)viewDidLayoutSubviews{
     --- your code ---
    } 
    

答案 2 :(得分:1)

对于Swift 3,如果您UIView内的海关UITableViewCell没有AutoLayout,并且您希望在方向更改时更新用户界面,则可以在{{UITableViewCell内执行此操作1}}自定义类:

override func layoutSubviews() {
    super.layoutSubviews()
    self.customView.layoutSubviews()
}

答案 3 :(得分:0)

其实我做过同样的事情。首先,您需要为不同的方向制作两个UITableViewCell.xib,然后在viewController中实现以下方法。

您无需在customCell.xib ViewController管理tabelView方向中自动检测设备方向。

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{

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


        }
        else
        {


        }
    }
    else
    {

    }
[yourTable reloadData];
}    

然后在你的tabelView 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;
                            }

答案 4 :(得分:0)

你要看的两件事是:

  1. 首先,检查设备是否已旋转以使用

    重新加载表格

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

  2. 其次,在 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中,使用UIInterfaceOrientationIsLandscape(self.interfaceOrientation)检查GUI状态以加载所需的布局。