在 iOS7 上没有一个对我有用的答案,所以我做了一些自己的研究并创建了一个可行的解决方案。这将涉及子类化 UISplitViewController 以获得完整功能。
我将给出答案,就好像我们刚刚为 iPad 创建了一个具有所有设备方向的新项目,并将自定义 UISplitViewController 设置为主视图控制器。
创建您的自定义UISplitViewController。在这个例子中,我的被称为MySplitViewController。所有代码都将基于MySplitViewController.m。
我们需要从UISplitViewControllerDelegate 访问一个方法,所以添加它并设置委托。我们还将设置一个委托转发器,以防您需要从另一个类调用委托方法。
@interface MySplitViewController () <UISplitViewControllerDelegate>
@property (nonatomic, weak) id<UISplitViewControllerDelegate> realDelegate;
@end
@implementation MySplitViewController
- (instancetype)init {
self = [super init];
if (self) {
self.delegate = self;
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
self.delegate = self;
}
return self;
}
- (void)setDelegate:(id<UISplitViewControllerDelegate>)delegate {
[super setDelegate:nil];
self.realDelegate = (delegate != self) ? delegate : nil;
[super setDelegate:delegate ? self : nil];
}
- (BOOL)respondsToSelector:(SEL)aSelector {
id delegate = self.realDelegate;
return [super respondsToSelector:aSelector] || [delegate respondsToSelector:aSelector];
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
id delegate = self.realDelegate;
return [delegate respondsToSelector:aSelector] ? delegate : [super forwardingTargetForSelector:aSelector];
}
设置主视图控制器和详细视图控制器。
- (void)viewDidLoad {
[super viewDidLoad];
UIViewController* masterViewController = [[UIViewController alloc] init];
masterViewController.view.backgroundColor = [UIColor yellowColor];
UIViewController* detailViewController = [[UIViewController alloc] init];
detailViewController.view.backgroundColor = [UIColor cyanColor];
self.viewControllers = @[masterViewController, detailViewController];
}
让我们将我们想要的宽度添加到一个方法中以便于参考。
- (CGFloat)desiredWidth {
return 200.0f;
}
我们将在展示主视图控制器之前对其进行操作。
- (void)splitViewController:(UISplitViewController *)svc popoverController:(UIPopoverController *)pc willPresentViewController:(UIViewController *)aViewController {
id realDelegate = self.realDelegate;
if ([realDelegate respondsToSelector:@selector(splitViewController:popoverController:willPresentViewController:)]) {
[realDelegate splitViewController:svc popoverController:pc willPresentViewController:aViewController];
}
CGRect rect = aViewController.view.frame;
rect.size.width = [self desiredWidth];
aViewController.view.frame = rect;
aViewController.view.superview.clipsToBounds = NO;
}
但是,现在我们只剩下这样的显示了。
所以要重写一个私有方法。是的,一个私有方法,它在 App Store 中仍然可以接受,因为它不是下划线私有方法。
- (CGFloat)leftColumnWidth {
return [self desiredWidth];
}
这涉及纵向模式。 -splitViewController:willShowViewController:invalidatingBarButtonItem: 也有类似的情况,您应该设置为横向。
但是在 iOS8 中这些都不需要。您将能够简单地调用最小和最大宽度属性!