46

iPadプログラミングガイドによると、splitViewの左側のペインは320ポイントに固定されています。しかし、私のマスタービューコントローラーの320ピクセルは多すぎます。それを減らして、詳細ビューコントローラにより多くのスペースを与えたいと思います。とにかく可能ですか?

固定幅について説明しているドキュメントへのリンク。

4

16 に答える 16

65

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];
    }
}
于 2013-10-03T11:48:06.343 に答える
36

IOS 8.0では、次のようにすることでこれを簡単に行うことができます。

1.MasterSplitViewController.hに追加します

@property(nonatomic, assign) CGFloat maximumPrimaryColumnWidth NS_AVAILABLE_IOS(8_0);

2.MasterSplitViewController.mviewDidLoadメソッドに追加します

 self.maximumPrimaryColumnWidth = 100;
 self.splitViewController.maximumPrimaryColumnWidth = self.maximumPrimaryColumnWidth;

これは、IOS 8の非常に優れた、シンプルで簡単な機能です。

于 2014-09-26T10:49:22.577 に答える
22

このコードは私のために働いています

[splitViewController setValue:[NSNumber numberWithFloat:200.0] forKey:@"_masterColumnWidth"];
于 2010-10-26T09:39:53.723 に答える
12

いいえ。


2つの私有地があります

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

ただし、プライベートであるということは、AppStoreアプリには使用できないことを意味します。

于 2010-06-01T10:55:27.527 に答える
10

iOS8では新しいプロパティが導入されました。

// 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

このプロパティを使用して、マスタービューコントローラーを目的の幅に調整します。

于 2014-09-21T10:40:47.663 に答える
8

これが私がSwiftを使ってiOS8でこれを行った方法です。

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
于 2014-11-28T15:11:04.740 に答える
6

ストーリーボードの方法は、@ Timが言及した、これです。

ここに画像の説明を入力してください

さらに、マスタービューが常に画面の特定の割合を占めるようにする場合は、代わりにKey Path = "preferredPrimaryColumnWidthFraction"を使用して、値を0.2(20%の画面サイズの場合)に設定できます。

「maximumPrimaryColumnWidth」は320に設定されているため、画面のパーセント値0.5(50%)を試しても、320を超えることはありません。これをオーバーライドする必要がある場合は、maximumPrimaryColumnWidthのキーパスを追加できます。

于 2016-11-29T17:21:23.320 に答える
5

iOS7ではどの答えもうまくいきませんでした。そこで私は自分で調査を行い、実用的なソリューションを作成しました。UISplitViewControllerこれには、全機能のサブクラス化が含まれます。

UISplitViewControllerすべてのデバイスの向きでiPad用の新しいプロジェクトを作成し、カスタムをメインビューコントローラーとして設定したかのように、答えを提示します。

カスタムを作成します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;
}

しかし、今はこのようなディスプレイが残っています。 ここに画像の説明を入力してください

したがって、プライベートメソッドをオーバーライドしようとしていました。はい、プライベートメソッドです。アンダースコアのプライベートメソッドではないため、AppStoreでも引き続き使用できます。

- (CGFloat)leftColumnWidth {
    return [self desiredWidth];
}

これはポートレートモードを扱います。ですから、同様のことで-splitViewController:willShowViewController:invalidatingBarButtonItem:、あなたは風景に設定されるべきです。

ただし、iOS8ではこれは必要ありません。最小幅と最大幅のプロパティを呼び出すだけで済みます。

于 2014-08-28T08:46:46.583 に答える
2

rootviewcontrollerに割り当てる前に、次のコードを使用してください。それはios7で私のために働きます

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

于 2014-11-25T15:03:06.070 に答える
2

これがIBからできるとは誰も言わなかったので、この答えを追加したいと思います。どうやら、UISplitViewContorllerの「ユーザー定義ランタイム属性」を次の詳細で設定できます。キーパス:masterColumnWidthタイプ:数値値:250

于 2015-07-18T16:01:27.220 に答える
2

私の場合、これを機能させるには最大値と最小値の両方を設定する必要がありました

mySplitViewController.preferredDisplayMode = .allVisible;
mySplitViewController.maximumPrimaryColumnWidth = UIScreen.main.bounds.width/2;
mySplitViewController.minimumPrimaryColumnWidth = UIScreen.main.bounds.width/2; 
于 2017-06-12T18:13:03.633 に答える
0

GSSplitViewControllerを使用できます。これはiOS7と8で動作します

splitView = [[GSSplitViewController alloc] init];
splitView.masterPaneWidth = 180;

に追加して含めることもできpod 'GSSplitViewController'ますPodfile

于 2015-06-17T12:31:34.593 に答える
0

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;

     }
于 2016-10-12T05:54:56.380 に答える
0

あなたが好きなように使用するSwift3.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)
于 2017-03-15T07:00:32.267 に答える
0
// in UISplitViewController subclass
// let more space for detail in portrait mode
- (void)viewWillLayoutSubviews
{
    CGFloat width;
    if (UIInterfaceOrientationIsPortrait(UIApplication.sharedApplication.statusBarOrientation)){
        width = CGRectGetWidth(self.view.bounds) * 0.25f;
    }
    else {
        width = CGRectGetWidth(self.view.bounds) * 0.33f;
    }
    width = (NSInteger)fminf(260, fmaxf(120, width));
    self.minimumPrimaryColumnWidth = width;
    self.maximumPrimaryColumnWidth = width;

    [super viewWillLayoutSubviews];
}
于 2019-04-10T15:33:24.160 に答える
-3

このコードは私のために働きます:)

@interface UISplitViewController(myExt) 
- (void)setNewMasterSize:(float)size; 
@end

@implementation UISplitViewController(myExt) - (void)setNewMasterSize:(float)size { _masterColumnWidth = size; } @end

ビュー(回転など)を使用して各操作で使用します

于 2010-08-24T19:29:29.203 に答える