开发者

UISplitViewController: remove divider line

开发者 https://www.devze.com 2022-12-26 02:46 出处:网络
When using UISplitViewController on the iPad there\'s a black vertical divider lin开发者_开发技巧e between the root and detail view. Is there any way to remove this line?

When using UISplitViewController on the iPad there's a black vertical divider lin开发者_开发技巧e between the root and detail view. Is there any way to remove this line?

Thanks


Excellent answer by @bteapot. I tested this and it works, even gets rid of the line between master/detail nav bars.

You can do this in storyboard by adding the "gutterWidth" key path and the value 0 to the USplitViewController runtime attributes.

UISplitViewController: remove divider line


Actuly I have some modification to answer of (Dylan)'s answer

in the appDelegate we need to add image in spliteview controller rather then window

self.splitViewController.view.opaque = NO;  
imgView = [[UIImageView alloc] initWithImage:
        [UIImage imageNamed:@"FullNavBar.png"]];  
[imgView setFrame:CGRectMake(0, 0, 1024, 44)];  
[[self.splitViewController view] insertSubview:imgView atIndex:0]; 
[[self.splitViewController view] setBackgroundColor:[UIColor clearColor]];  

here self is object of AppDelegate.

now Apply the answer of this thread : iPhoneOS SDK - Remove Corner Rounding from views (iPad problem) answer by (abs)

edit in above post's answer is

-(void) fixRoundedSplitViewCorner {  
     [self explode:[[UIApplication sharedApplication] keyWindow] level:0];  
}  
-(void) explode:(id)aView level:(int)level 
{

    if ([aView isKindOfClass:[UIImageView class]]) {
        UIImageView* roundedCornerImage = (UIImageView*)aView;
        roundedCornerImage.hidden = YES;
    }
    if (level < 2) {
        for (UIView *subview in [aView subviews]) {
            [self explode:subview level:(level + 1)];
        }
    }

    imgView.hidden = FALSE;
}

** make imgView.hidden to FALSE declare imgView to the AppDelegate.h file**

and dont forget to call this

-(void)didRotateFromInterfaceOrientation:
        UIInterfaceOrientation)fromInterfaceOrientation
{
    [yourAppDelegate performSelector:@selector(fixRoundedSplitViewCorner) 
          withObject:NULL afterDelay:0];
}


chintan adatiya answer covers only the corners and the navigation bar, but I found an trick how to cover the line between the Master and the Detail view.

It is not nice but it works like a charm.

  1. First create an image which is 1 px wide and 704 pixels high.

  2. In the didFinishLaunchingWithOptions add the following code:

    UIView *coverView = [[UIView alloc] initWithFrame:CGRectMake(320, 44, 1, 704)];
    [coverView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"divider_cover.png"]]];
    
    [splitViewController.view addSubview:coverView];
    

And done.

When you want a background image which is continues create 3 images:

  • Master: width: 320, height: 704
  • Detail: width: 703, height: 704
  • Divider:width: 1, height: 704


First post here, hi everyone.

I discovered how to do it accidentally... when I tried to find why I had LOST the divider line. Here's how to hide it, if you're still interested:

1) In your Detail (right-side) view, make sure you have a subview that spans the whole view.

2) Offset this subview view to (-1, 0).

3) Make sure that the Detail View has its "Clip Subviews" option unchecked.

Voilà, enjoy.


You can mostly get rid of it by setting another image behind it in the main window's views. This is from the app delegate didFinishLaunchingWithOptions

// Add the split view controller's view to the window and display.
splitViewController.view.opaque = NO;
splitViewController.view.backgroundColor = [UIColor clearColor];
[window addSubview:splitViewController.view];
[window insertSubview:bgImageView belowSubview:splitViewController.view];
[window makeKeyAndVisible];

But it still leaves two visual artifacts at the top and the bottom that appear to be custom drawn by the splitviewcontroller.


Interestingly, In the app that I'm working on I want a black background color for both views in the UISplitViewController. I'd like to change the color of the divider line to white (so that you can see it). Making both background colors black is one way to get rid of (make invisible) the dividing line but that's probably not a solution for most people.


Tested on iOS10 (probably will work on iOS9 too).

splitviewController.view.backgroundColor = UIColor.white

it removes divider. Apparently divider is just a gap between master and detail container.


I looked around for a while, and came to the conclusion that theres no way to do this, other than to create your own custom split view.


Try the MGSplitViewController by Matt Gammell

http://mattgemmell.com/2010/07/31/mgsplitviewcontroller-for-ipad


I may be late here, but I DO have a solution that works. It even works for the iOS 8+ splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; and seamlessly slides in and out when you press the Full Screen toggle button.

Here is the trick :

first Subclass UISplitViewController.m

In the header add the follwing :

@property (strong, nonatomic) UIView *fakeNavBarBGView;

In the viewDidLoad method add the following code :

CGFloat fakeNavBarWidth = 321; // It is important to have it span the width of the master view + 1 because it will not move when the split view slides it's subviews (master and detail)
CGFloat navbarHeight = self.navigationController.navigationBar.frame.size.height + 20;
self.fakeNavBarBGView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, fakeNavBarWidth, navbarHeight)];
self.fakeNavBarBGView.backgroundColor = [UIColor redColor];

// Add Fake navbar to back of view
[self.view insertSubview:self.fakeNavBarBGView atIndex:0];

// SplitView Controller
UISplitViewController *splitViewController = self;
DetailViewController *detailVC = [navigationController.viewControllers lastObject];

detailVC.fakeNavBarSubView = self.fakeNavBarBGView;
detailVC.SVView = self.view;

In the DetailViewController.h add the following :

@property (strong, nonatomic) UIView *SVView;
@property (strong, nonatomic) UIView *fakeNavBarSubView;

Now here is the final trick : in the DetailViewController.m, add the following in the viewDidLoad method (called every time you click the Master table) :

[self.SVView sendSubviewToBack:self.fakeNavBarSubView];
[self.SVView bringSubviewToFront:self.view];

Run it and watch the magic ;-)


Private API (can cause App Store rejection):

[splitViewController setValue:@0.0 forKey:@"gutterWidth"];


I did this accidentally by setting the backgroundColor property of the first viewController's view - possibly to clearColor, I don't remember now.


UIManager.put("SplitPaneDivider.draggingColor", new Color(255, 255, 255, 0));

0

精彩评论

暂无评论...
验证码 换一张
取 消