Ни один из ответов не работал для меня на 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 все это не понадобится. Вы сможете просто вызывать свойство min и max width!