Подтвердить что ты не робот

Изменение ширины мастера в UISplitViewController

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

Ссылка на document, который говорит об фиксированной ширине.

4b9b3361

Ответ 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

и использовать его на каждой операции с представлением (например, вращением)