Изменить ширину Мастер в UISplitViewController - PullRequest
41 голосов
/ 01 июня 2010

В руководстве по программированию для iPad сказано, что левая панель splitView зафиксирована на 320 точках.Но 320 пикселей для моего главного контроллера просмотра это слишком много.Я хотел бы уменьшить его и дать больше места для детального просмотра контроллера.Возможно ли это в любом случае?

Ссылка на документ , который говорит о фиксированной ширине.

Ответы [ 16 ]

66 голосов
/ 03 октября 2013

Если вы создаете подкласс 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];
    }
}
35 голосов
/ 26 сентября 2014

В 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.

22 голосов
/ 26 октября 2010

этот код работает для меня

[splitViewController setValue:[NSNumber numberWithFloat:200.0] forKey:@"_masterColumnWidth"];
12 голосов
/ 01 июня 2010

номер


Есть два частных свойства

@property(access,nonatomic) CGFloat masterColumnWidth;
@property(access,nonatomic) CGFloat leftColumnWidth; // both are the same!

но конфиденциальность означает, что их нельзя использовать для приложений AppStore.

10 голосов
/ 21 сентября 2014

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

Используйте это свойство, чтобы настроить ваш главный viewcontroller на желаемую ширину.

7 голосов
/ 28 ноября 2014

Вот как я это сделал в 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
5 голосов
/ 29 ноября 2016

Вот способ раскадровки, упомянутый @Tim:

enter image description here

Кроме того, если вы хотите, чтобы главное представление всегда занимало определенный процент экрана, вы можете вместо этого использовать Key Path = "предпочитаемое_первичное_колонное_пределение_фракций> и установить значение 0,2 (для размера экрана 20%).

Обратите внимание, что для параметра «MaximumPrimaryColumnWidth» задано значение 320, поэтому при использовании значения процента экрана, равного 0,5 (50%), оно не превысит 320. Вы можете добавить ключевой путь для MaximumPrimaryColumnWidth, если необходимо переопределить это.

5 голосов
/ 28 августа 2014

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

2 голосов
/ 18 июля 2015

Поскольку никто не упомянул, что это можно сделать из IB, я хочу добавить этот ответ. Очевидно, вы можете установить «Определенные пользователем атрибуты времени выполнения» для UISplitViewContorller со следующими подробностями: Путь к ключу: masterColumnWidth Тип: Номер Значение: 250

2 голосов
/ 25 ноября 2014

используйте следующий код перед назначением rootviewcontroller. У меня работает с ios7

[self.splitViewController setValue:[NSNumber numberWithFloat:256.0] forKey:@"_masterColumnWidth"]; self.window.rootViewController = self.splitViewController;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...