Изменение ширины мастера в UISplitViewController
В руководстве по программированию iPad говорится, что левая панель splitView фиксирована на 320 точек. Но 320 пикселей для моего контроллера главного представления слишком много. Я хотел бы уменьшить его и предоставить больше места для подробного просмотра контроллера. Возможно ли это в любом случае?
Ссылка на document, который говорит об фиксированной ширине.
Ответы
Ответ 1
Если вы подклассифицируете UISplitViewController, вы можете реализовать -viewDidLayoutSubviews
и отрегулировать ширину. Это чисто, без хаков или частных API, и работает даже с вращением.
- (void)viewDidLayoutSubviews
{
const CGFloat kMasterViewWidth = 240.0;
UIViewController *masterViewController = [self.viewControllers objectAtIndex:0];
UIViewController *detailViewController = [self.viewControllers objectAtIndex:1];
if (detailViewController.view.frame.origin.x > 0.0) {
// Adjust the width of the master view
CGRect masterViewFrame = masterViewController.view.frame;
CGFloat deltaX = masterViewFrame.size.width - kMasterViewWidth;
masterViewFrame.size.width -= deltaX;
masterViewController.view.frame = masterViewFrame;
// Adjust the width of the detail view
CGRect detailViewFrame = detailViewController.view.frame;
detailViewFrame.origin.x -= deltaX;
detailViewFrame.size.width += deltaX;
detailViewController.view.frame = detailViewFrame;
[masterViewController.view setNeedsLayout];
[detailViewController.view setNeedsLayout];
}
}
Ответ 2
В IOS 8.0 вы можете легко сделать это, выполнив следующие действия:
1. В вашем MasterSplitViewController.h добавьте
@property(nonatomic, assign) CGFloat maximumPrimaryColumnWidth NS_AVAILABLE_IOS(8_0);
2. В методе masterSplitViewController.m viewDidLoad добавьте
self.maximumPrimaryColumnWidth = 100;
self.splitViewController.maximumPrimaryColumnWidth = self.maximumPrimaryColumnWidth;
Это действительно хорошая, простая и простая функция IOS 8.
Ответ 3
этот код работает для меня
[splitViewController setValue:[NSNumber numberWithFloat:200.0] forKey:@"_masterColumnWidth"];
Ответ 4
Нет.
Есть два частных свойства
@property(access,nonatomic) CGFloat masterColumnWidth;
@property(access,nonatomic) CGFloat leftColumnWidth; // both are the same!
но, будучи частным, они не могут использоваться для приложений AppStore.
Ответ 5
Почему бы не попробовать Matt Gemmell отлично MGSplitViewController? Он открыт с открытым исходным кодом и доступен на GitHub.
Грегор,
Швеция
Ответ 6
В iOS 8 введено новое свойство:
// An animatable property that can be used to adjust the maximum absolute width of the primary view controller in the split view controller.
@property(nonatomic, assign) CGFloat maximumPrimaryColumnWidth NS_AVAILABLE_IOS(8_0); // default: UISplitViewControllerAutomaticDimension
Используйте это свойство, чтобы настроить ваш главный контроллер просмотра на нужную ширину.
Ответ 7
Вот как я сделал это в iOS8 с Swift.
class MainSplitViewController: UISplitViewController {
override func viewDidLoad() {
self.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible
self.maximumPrimaryColumnWidth = 100 // specify your width here
}
}
Если вам нужно динамически менять ширину в пределах вашего основного/подробного представления в режиме разделения, выполните следующие действия:
var splitViewController = self.splitViewController as MainSplitViewController
splitViewController.maximumPrimaryColumnWidth = 400
Ответ 8
Ни один из ответов не работал у меня на 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;
}
Однако теперь мы остаемся с дисплеем, подобным этому.
![enter image description here]()
Так что они собирались переопределить частный метод. Да, частный метод, он все равно будет приемлемым в App Store, поскольку он не является личным методом подчёркивания.
- (CGFloat)leftColumnWidth {
return [self desiredWidth];
}
Это относится к портретному режиму. То же самое для -splitViewController:willShowViewController:invalidatingBarButtonItem:
, и вы должны быть настроены для пейзажа.
Однако в iOS8 этого не потребуется. Вы сможете просто называть свойство минимальной и максимальной ширины!
Ответ 9
Путь к раскадровке был бы таким, упомянутым @Tim:
![введите описание изображения здесь]()
Кроме того, если вы хотите, чтобы главное представление всегда занимало определенный процент экрана, вы можете использовать Key Path = "preferredPrimaryColumnWidthFraction" вместо этого и установить значение 0,2 (для размера экрана 20%).
Обратите внимание, что для параметра "максимумPrimaryColumnWidth" установлено значение 320, поэтому, если вы попробуете процентное значение экрана 0,5 (50%), оно не будет превышать 320. Вы можете добавить путь ключа для максимальногоPrimaryColumnWidth, если вам нужно переопределить это.
Ответ 10
используйте следующий код перед назначением rootviewcontroller. Это работает для меня с ios7
[self.splitViewController setValue:[NSNumber numberWithFloat:256.0] forKey:@"_masterColumnWidth"];
self.window.rootViewController = self.splitViewController;
Ответ 11
Поскольку никто не упоминал, что это можно сделать из IB, я хочу добавить этот ответ. По-видимому, вы можете установить "User Defined Runtime Attributes" для UISplitViewContorller со следующими подробностями:
Путь к ключу: masterColumnWidth
Тип: Номер
Значение: 250
Ответ 12
Вы можете использовать GSSplitViewController. Это будет работать на iOS 7 и 8
splitView = [[GSSplitViewController alloc] init];
splitView.masterPaneWidth = 180;
Вы также можете включить его, добавив pod 'GSSplitViewController'
к вашему Podfile
.
Ответ 13
ViewController.h @property(nonatomic, assign) CGFloat maximumPrimaryColumnWidth NS_AVAILABLE_IOS(8_0);
ViewController.m
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
if (SYSTEM_VERSION_LESS_THAN(@"10.0")) {
[self setValue:[NSNumber numberWithFloat:200.0]forKey:@"_masterColumnWidth"];
}else{
self.maximumPrimaryColumnWidth = 200;
self.splitViewController.maximumPrimaryColumnWidth = self.maximumPrimaryColumnWidth;
}
Ответ 14
Swift 3.0, который вы используете как
let widthfraction = 2.0 //Your desired value for me 2.0
splitViewController?.preferredPrimaryColumnWidthFraction = 0.40
let minimumWidth = min((splitViewController?.view.bounds.size.width)!,(splitViewController?.view.bounds.height)!)
splitViewController?.minimumPrimaryColumnWidth = minimumWidth / widthFraction
splitViewController?.maximumPrimaryColumnWidth = minimumWidth / widthFraction
let leftNavController = splitViewController?.viewControllers.first as! UINavigationController
leftNavController.view.frame = CGRect(x: leftNavController.view.frame.origin.x, y: leftNavController.view.frame.origin.y, width: (minimumWidth / widthFraction), height: leftNavController.view.frame.height)
Ответ 15
В моем случае мне пришлось установить как максимум, так и минимум, чтобы сделать эту работу
mySplitViewController.preferredDisplayMode = .allVisible;
mySplitViewController.maximumPrimaryColumnWidth = UIScreen.main.bounds.width/2;
mySplitViewController.minimumPrimaryColumnWidth = UIScreen.main.bounds.width/2;
Ответ 16
Этот код работает для меня:)
@interface UISplitViewController(myExt)
- (void)setNewMasterSize:(float)size;
@end
@implementation UISplitViewController(myExt)
- (void)setNewMasterSize:(float)size
{
_masterColumnWidth = size;
}
@end
и использовать его на каждой операции с представлением (например, вращением)