【问题标题】:ios: Custom Segue between two viewcontrollers in landscape modeios:横向模式下两个视图控制器之间的自定义 Segue
【发布时间】:2011-11-24 17:49:03
【问题描述】:

我有两个 UIViewControllers 包含在一个 navigatoin 视图控制器中,并且都处于横向模式。我想在两个 uiviewcontroller 之间切换而没有像推这样的动画。因此,如果用户在第一个视图控制器中单击一个按钮,我会在这两者之间执行自定义 segue。

#import <Foundation/Foundation.h>
#import "AppDelegate.h"

@class AppDelegate;

@interface NonAnimatedSegue : UIStoryboardSegue {

}

@property (nonatomic,assign) AppDelegate* appDelegate;

@end

这是实现:

#import "NonAnimatedSegue.h"

@implementation NonAnimatedSegue

@synthesize appDelegate = _appDelegate;

-(void) perform{
    self.appDelegate = [[UIApplication sharedApplication] delegate];
    UIViewController *srcViewController = (UIViewController *) self.sourceViewController;
    UIViewController *destViewController = (UIViewController *) self.destinationViewController;
[srcViewController.view removeFromSuperview];
[self.appDelegate.window addSubview:destViewController.view];
self.appDelegate.window.rootViewController=destViewController;
}

@end

在故事板中,我切换到自定义 segue,实际上它工作正常。唯一的问题是第二个 uiviewcontroller 不是横向显示而是纵向显示。如果我删除自定义 segue 并用 push segue 替换它,那么一切正常,第二个视图控制器以横向模式显示。

那么如果我使用自定义 segue,我该怎么做才能使第二个视图控制器也处于横向视图中?

【问题讨论】:

    标签: ios uiviewcontroller push


    【解决方案1】:

    上面的代码不起作用,因为destinationViewController 不能自己接收来自UIInterfaceOrientation 的更新。它通过它的“容器视图控制器”(导航控制器)接收这些更新。为了让自定义 segue 正常工作,我们需要通过 Navigation Controller 转换到新视图。

    -(void) perform{
        [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:NO];
    }
    

    【讨论】:

      【解决方案2】:

      您可以让目标视图控制器从源控制器获取中心/变换/边界(已正确定向):

      -(void) perform{
          self.appDelegate = [[UIApplication sharedApplication] delegate];
          UIViewController *src = (UIViewController *) self.sourceViewController;
          UIViewController *dst = (UIViewController *) self.destinationViewController;
      
      // match orientation/position
      dst.view.center = src.view.center;
      dst.view.transform = src.view.transform;
      dst.view.bounds = src.view.bounds;
      
      [dst.view removeFromSuperview];
      [self.appDelegate.window addSubview:dst.view];
      self.appDelegate.window.rootViewController=dst;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        相关资源
        最近更新 更多