iPad编程指南说splitView的左侧窗格固定为320点。但是我的主视图控制器的320像素太多了。我想减少它,并为详细视图控制器提供更多空间。反正有可能吗?
链接到document,说明固定宽度。
答案 0 :(得分:66)
如果你是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];
}
}
答案 1 :(得分:35)
在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的一个非常好,简单和简单的功能。
答案 2 :(得分:22)
这段代码对我有用
[splitViewController setValue:[NSNumber numberWithFloat:200.0] forKey:@"_masterColumnWidth"];
答案 3 :(得分:12)
没有
有两个私有属性
@property(access,nonatomic) CGFloat masterColumnWidth;
@property(access,nonatomic) CGFloat leftColumnWidth; // both are the same!
但是私有意味着他们不能用于AppStore应用程序。
答案 4 :(得分:10)
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
使用此属性将主视图控制器调整到所需的宽度。
答案 5 :(得分: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
答案 6 :(得分:5)
在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;
}
然而,现在我们留下这样的显示器。
所以要覆盖私有方法。是的私有方法,它仍然可以在App Store中接受,因为它不是下划线的私有方法。
- (CGFloat)leftColumnWidth {
return [self desiredWidth];
}
这涉及肖像模式。所以对于-splitViewController:willShowViewController:invalidatingBarButtonItem:
来说类似的事情,你应该为景观设置。
但iOS8中不需要这些。您将能够简单地调用最小和最大宽度属性!
答案 7 :(得分:5)
故事板的方式就是这个,由@Tim提到:
此外,如果您希望主视图始终占据屏幕的某个百分比,则可以使用Key Path =“preferredPrimaryColumnWidthFraction”,并将值设置为0.2(屏幕大小为20%)。
请注意,“maximumPrimaryColumnWidth”设置为320,因此如果您尝试屏幕百分比值0.5(50%),它将不会超过320.如果您需要覆盖,可以为maximumPrimaryColumnWidth添加关键路径此
答案 8 :(得分:2)
在分配给rootviewcontroller之前使用以下代码。它适用于ios7
[self.splitViewController setValue:[NSNumber numberWithFloat:256.0] forKey:@"_masterColumnWidth"];
self.window.rootViewController = self.splitViewController;
答案 9 :(得分:2)
由于没有人提到这可以从IB完成,我想添加这个答案。显然,您可以设置&#34;用户定义的运行时属性&#34;对于UISplitViewContorller,具有以下详细信息: 关键路径:masterColumnWidth 类型:数字 价值:250
答案 10 :(得分:0)
您可以使用GSSplitViewController。这个适用于iOS 7和8
splitView = [[GSSplitViewController alloc] init];
splitView.masterPaneWidth = 180;
您也可以将pod 'GSSplitViewController'
添加到Podfile
。
答案 11 :(得分: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;
}
答案 12 :(得分:0)
您使用的Swift 3.0
//var acceptedFileFormatList = hidAcceptedFileFormat.split(',');
答案 13 :(得分:0)
在我的情况下,我必须设置最大值和最小值才能完成这项工作
mySplitViewController.preferredDisplayMode = .allVisible;
mySplitViewController.maximumPrimaryColumnWidth = UIScreen.main.bounds.width/2;
mySplitViewController.minimumPrimaryColumnWidth = UIScreen.main.bounds.width/2;
答案 14 :(得分: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];
}
答案 15 :(得分:-3)
此代码适用于我:)
@interface UISplitViewController(myExt)
- (void)setNewMasterSize:(float)size;
@end
@implementation UISplitViewController(myExt)
- (void)setNewMasterSize:(float)size
{
_masterColumnWidth = size;
}
@end
并在每个带有视图的操作(如旋转)
上使用它