IPadプログラミングガイドには、splitViewの左ペインが320ポイントに固定されていると書かれています。しかし、マスタービューコントローラーの320ピクセルは大きすぎます。これを減らして、詳細ビューのコントローラーにより多くのスペースを与えたいと思います。とにかくそれは可能ですか?
document へのリンクは、固定幅について述べています。
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];
}
}
IOS 8.0では、以下を実行することで簡単にこれを行うことができます。
1。MasterSplitViewController.hに追加
@property(nonatomic, assign) CGFloat maximumPrimaryColumnWidth NS_AVAILABLE_IOS(8_0);
2。MasterSplitViewController.mのviewDidLoadメソッドにadd
self.maximumPrimaryColumnWidth = 100;
self.splitViewController.maximumPrimaryColumnWidth = self.maximumPrimaryColumnWidth;
これはIOS 8。
このコードは私のために働いています
[splitViewController setValue:[NSNumber numberWithFloat:200.0] forKey:@"_masterColumnWidth"];
番号。
2つのプライベートプロパティがあります
@property(access,nonatomic) CGFloat masterColumnWidth;
@property(access,nonatomic) CGFloat leftColumnWidth; // both are the same!
プライベートであるため、AppStoreアプリには使用できません。
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を目的の幅に調整します。
IOS 8で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
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;
}
表示する前にマスターView Controllerを操作します。
- (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では必要ありません。最小幅と最大幅のプロパティを簡単に呼び出すことができます!
これはIBからできるとは誰も言及していないので、この答えを追加したいと思います。どうやら、UISplitViewContorllerの「ユーザー定義のランタイム属性」を次の詳細で設定できます。キーパス:masterColumnWidthタイプ:数値:250
rootviewcontrollerに割り当てる前に、次のコードを使用します。 ios7で動作します
[self.splitViewController setValue:[NSNumber numberWithFloat:256.0] forKey:@"_masterColumnWidth"]; self.window.rootViewController = self.splitViewController;
使用する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)
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;
}
// 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];
}
GSSplitViewController を使用できます。これはiOS 7および8で動作します
splitView = [[GSSplitViewController alloc] init];
splitView.masterPaneWidth = 180;
pod 'GSSplitViewController'
をPodfile
に追加して含めることもできます。
私の場合、この作業を行うには最大値と最小値の両方を設定する必要がありました
mySplitViewController.preferredDisplayMode = .allVisible;
mySplitViewController.maximumPrimaryColumnWidth = UIScreen.main.bounds.width/2;
mySplitViewController.minimumPrimaryColumnWidth = UIScreen.main.bounds.width/2;