- MGSplitViewController updated to last version with iOS 8 fixes ios-revival
authorantonc27 <antonc27@mail.ru>
Fri, 14 Aug 2015 01:55:42 +0200
branchios-revival
changeset 11115 3729ac42189b
parent 11114 6a0bd9c6cc82
child 11116 102684240fe8
- MGSplitViewController updated to last version with iOS 8 fixes
project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.h
project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m
project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.h
project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m
project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.h
project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.h	Thu Aug 13 13:41:50 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.h	Fri Aug 14 01:55:42 2015 +0200
@@ -9,23 +9,23 @@
 #import <UIKit/UIKit.h>
 
 typedef enum _MGCornersPosition {
-    MGCornersPositionLeadingVertical    = 0, // top of screen for a left/right split.
-    MGCornersPositionTrailingVertical   = 1, // bottom of screen for a left/right split.
-    MGCornersPositionLeadingHorizontal  = 2, // left of screen for a top/bottom split.
-    MGCornersPositionTrailingHorizontal = 3  // right of screen for a top/bottom split.
+	MGCornersPositionLeadingVertical	= 0, // top of screen for a left/right split.
+	MGCornersPositionTrailingVertical	= 1, // bottom of screen for a left/right split.
+	MGCornersPositionLeadingHorizontal	= 2, // left of screen for a top/bottom split.
+	MGCornersPositionTrailingHorizontal	= 3  // right of screen for a top/bottom split.
 } MGCornersPosition;
 
 @class MGSplitViewController;
 @interface MGSplitCornersView : UIView {
-    float cornerRadius;
-    MGSplitViewController *splitViewController;
-    MGCornersPosition cornersPosition;
-    UIColor *cornerBackgroundColor;
+	float cornerRadius;
+	MGSplitViewController *__unsafe_unretained splitViewController;
+	MGCornersPosition cornersPosition;
+	UIColor *cornerBackgroundColor;
 }
 
 @property (nonatomic, assign) float cornerRadius;
-@property (nonatomic, assign) MGSplitViewController *splitViewController; // weak ref.
+@property (nonatomic, unsafe_unretained) MGSplitViewController *splitViewController; // weak ref.
 @property (nonatomic, assign) MGCornersPosition cornersPosition; // don't change this manually; let the splitViewController manage it.
-@property (nonatomic, retain) UIColor *cornerBackgroundColor;
+@property (nonatomic, strong) UIColor *cornerBackgroundColor;
 
 @end
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m	Thu Aug 13 13:41:50 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitCornersView.m	Fri Aug 14 01:55:42 2015 +0200
@@ -7,7 +7,7 @@
 //
 
 #import "MGSplitCornersView.h"
-#import "CGPointUtils.h"
+
 
 @implementation MGSplitCornersView
 
@@ -19,23 +19,34 @@
 - (id)initWithFrame:(CGRect)frame
 {
     if ((self = [super initWithFrame:frame])) {
-        self.contentMode = UIViewContentModeRedraw;
-        self.userInteractionEnabled = NO;
-        self.opaque = NO;
-        self.backgroundColor = [UIColor clearColor];
-        cornerRadius = 0.0; // actual value is set by the splitViewController.
-        cornersPosition = MGCornersPositionLeadingVertical;
+		self.contentMode = UIViewContentModeRedraw;
+		self.userInteractionEnabled = NO;
+		self.opaque = NO;
+		self.backgroundColor = [UIColor clearColor];
+		cornerRadius = 0.0; // actual value is set by the splitViewController.
+		cornersPosition = MGCornersPositionLeadingVertical;
     }
-
+	
     return self;
 }
 
 
 - (void)dealloc
 {
-    self.cornerBackgroundColor = nil;
+	self.cornerBackgroundColor = nil;
+    
+    [super dealloc];
+}
+
 
-    [super dealloc];
+#pragma mark -
+#pragma mark Geometry helpers
+
+
+static double deg2Rad(double degrees)
+{
+    // Converts degrees to radians.
+    return degrees * (M_PI / 180.0);
 }
 
 
@@ -45,131 +56,127 @@
 
 - (void)drawRect:(CGRect)rect
 {
-    // Draw two appropriate corners, with cornerBackgroundColor behind them.
-    if (cornerRadius > 0) {
-        if (NO) { // just for debugging.
-            [[UIColor redColor] set];
-            UIRectFill(self.bounds);
-        }
-
-        float maxX = CGRectGetMaxX(self.bounds);
-        float maxY = CGRectGetMaxY(self.bounds);
-        UIBezierPath *path = [UIBezierPath bezierPath];
-        CGPoint pt = CGPointZero;
-        switch (cornersPosition) {
-            case MGCornersPositionLeadingVertical: // top of screen for a left/right split
-                [path moveToPoint:pt];
-                pt.y += cornerRadius;
-                [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(90) endAngle:0 clockwise:YES]];
-                pt.x += cornerRadius;
-                pt.y -= cornerRadius;
-                [path addLineToPoint:pt];
-                [path addLineToPoint:CGPointZero];
-                [path closePath];
-
-                pt.x = maxX - cornerRadius;
-                pt.y = 0;
-                [path moveToPoint:pt];
-                pt.y = maxY;
-                [path addLineToPoint:pt];
-                pt.x += cornerRadius;
-                [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(90) clockwise:YES]];
-                pt.y -= cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x -= cornerRadius;
-                [path addLineToPoint:pt];
-                [path closePath];
-
-                break;
-
-            case MGCornersPositionTrailingVertical: // bottom of screen for a left/right split
-                pt.y = maxY;
-                [path moveToPoint:pt];
-                pt.y -= cornerRadius;
-                [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(270) endAngle:degreesToRadians(360) clockwise:NO]];
-                pt.x += cornerRadius;
-                pt.y += cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x -= cornerRadius;
-                [path addLineToPoint:pt];
-                [path closePath];
-
-                pt.x = maxX - cornerRadius;
-                pt.y = maxY;
-                [path moveToPoint:pt];
-                pt.y -= cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x += cornerRadius;
-                [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(270) clockwise:NO]];
-                pt.y += cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x -= cornerRadius;
-                [path addLineToPoint:pt];
-                [path closePath];
-
-                break;
-
-            case MGCornersPositionLeadingHorizontal: // left of screen for a top/bottom split
-                pt.x = 0;
-                pt.y = cornerRadius;
-                [path moveToPoint:pt];
-                pt.y -= cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x += cornerRadius;
-                [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(270) clockwise:NO]];
-                pt.y += cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x -= cornerRadius;
-                [path addLineToPoint:pt];
-                [path closePath];
-
-                pt.x = 0;
-                pt.y = maxY - cornerRadius;
-                [path moveToPoint:pt];
-                pt.y = maxY;
-                [path addLineToPoint:pt];
-                pt.x += cornerRadius;
-                [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(180) endAngle:degreesToRadians(90) clockwise:YES]];
-                pt.y -= cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x -= cornerRadius;
-                [path addLineToPoint:pt];
-                [path closePath];
-
-                break;
-
-            case MGCornersPositionTrailingHorizontal: // right of screen for a top/bottom split
-                pt.y = cornerRadius;
-                [path moveToPoint:pt];
-                pt.y -= cornerRadius;
-                [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(270) endAngle:degreesToRadians(360) clockwise:NO]];
-                pt.x += cornerRadius;
-                pt.y += cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x -= cornerRadius;
-                [path addLineToPoint:pt];
-                [path closePath];
-
-                pt.y = maxY - cornerRadius;
-                [path moveToPoint:pt];
-                pt.y += cornerRadius;
-                [path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:degreesToRadians(90) endAngle:0 clockwise:YES]];
-                pt.x += cornerRadius;
-                pt.y -= cornerRadius;
-                [path addLineToPoint:pt];
-                pt.x -= cornerRadius;
-                [path addLineToPoint:pt];
-                [path closePath];
-
-                break;
-
-            default:
-                break;
-        }
-
-        [self.cornerBackgroundColor set];
-        [path fill];
-    }
+	// Draw two appropriate corners, with cornerBackgroundColor behind them.
+	if (cornerRadius > 0) {
+		
+		float maxX = CGRectGetMaxX(self.bounds);
+		float maxY = CGRectGetMaxY(self.bounds);
+		UIBezierPath *path = [UIBezierPath bezierPath];
+		CGPoint pt = CGPointZero;
+		switch (cornersPosition) {
+			case MGCornersPositionLeadingVertical: // top of screen for a left/right split
+				[path moveToPoint:pt];
+				pt.y += cornerRadius;
+				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(90) endAngle:0 clockwise:YES]];
+				pt.x += cornerRadius;
+				pt.y -= cornerRadius;
+				[path addLineToPoint:pt];
+				[path addLineToPoint:CGPointZero];
+				[path closePath];
+				
+				pt.x = maxX - cornerRadius;
+				pt.y = 0;
+				[path moveToPoint:pt];
+				pt.y = maxY;
+				[path addLineToPoint:pt];
+				pt.x += cornerRadius;
+				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(180) endAngle:(float)deg2Rad(90) clockwise:YES]];
+				pt.y -= cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x -= cornerRadius;
+				[path addLineToPoint:pt];
+				[path closePath];
+				
+				break;
+				
+			case MGCornersPositionTrailingVertical: // bottom of screen for a left/right split
+				pt.y = maxY;
+				[path moveToPoint:pt];
+				pt.y -= cornerRadius;
+				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(270) endAngle:(float)deg2Rad(360) clockwise:NO]];
+				pt.x += cornerRadius;
+				pt.y += cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x -= cornerRadius;
+				[path addLineToPoint:pt];
+				[path closePath];
+				
+				pt.x = maxX - cornerRadius;
+				pt.y = maxY;
+				[path moveToPoint:pt];
+				pt.y -= cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x += cornerRadius;
+				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(180) endAngle:(float)deg2Rad(270) clockwise:NO]];
+				pt.y += cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x -= cornerRadius;
+				[path addLineToPoint:pt];
+				[path closePath];
+				
+				break;
+				
+			case MGCornersPositionLeadingHorizontal: // left of screen for a top/bottom split
+				pt.x = 0;
+				pt.y = cornerRadius;
+				[path moveToPoint:pt];
+				pt.y -= cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x += cornerRadius;
+				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(180) endAngle:(float)deg2Rad(270) clockwise:NO]];
+				pt.y += cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x -= cornerRadius;
+				[path addLineToPoint:pt];
+				[path closePath];
+				
+				pt.x = 0;
+				pt.y = maxY - cornerRadius;
+				[path moveToPoint:pt];
+				pt.y = maxY;
+				[path addLineToPoint:pt];
+				pt.x += cornerRadius;
+				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(180) endAngle:(float)deg2Rad(90) clockwise:YES]];
+				pt.y -= cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x -= cornerRadius;
+				[path addLineToPoint:pt];
+				[path closePath];
+				
+				break;
+				
+			case MGCornersPositionTrailingHorizontal: // right of screen for a top/bottom split
+				pt.y = cornerRadius;
+				[path moveToPoint:pt];
+				pt.y -= cornerRadius;
+				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(270) endAngle:(float)deg2Rad(360) clockwise:NO]];
+				pt.x += cornerRadius;
+				pt.y += cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x -= cornerRadius;
+				[path addLineToPoint:pt];
+				[path closePath];
+				
+				pt.y = maxY - cornerRadius;
+				[path moveToPoint:pt];
+				pt.y += cornerRadius;
+				[path appendPath:[UIBezierPath bezierPathWithArcCenter:pt radius:cornerRadius startAngle:(float)deg2Rad(90) endAngle:0 clockwise:YES]];
+				pt.x += cornerRadius;
+				pt.y -= cornerRadius;
+				[path addLineToPoint:pt];
+				pt.x -= cornerRadius;
+				[path addLineToPoint:pt];
+				[path closePath];
+				
+				break;
+				
+			default:
+				break;
+		}
+		
+		[self.cornerBackgroundColor set];
+		[path fill];
+	}
 }
 
 
@@ -179,38 +186,37 @@
 
 - (void)setCornerRadius:(float)newRadius
 {
-    if (newRadius != cornerRadius) {
-        cornerRadius = newRadius;
-        [self setNeedsDisplay];
-    }
+	if (newRadius != cornerRadius) {
+		cornerRadius = newRadius;
+		[self setNeedsDisplay];
+	}
 }
 
 
 - (void)setSplitViewController:(MGSplitViewController *)theController
 {
-    if (theController != splitViewController) {
-        splitViewController = theController;
-        [self setNeedsDisplay];
-    }
+	if (theController != splitViewController) {
+		splitViewController = theController;
+		[self setNeedsDisplay];
+	}
 }
 
 
 - (void)setCornersPosition:(MGCornersPosition)posn
 {
-    if (cornersPosition != posn) {
-        cornersPosition = posn;
-        [self setNeedsDisplay];
-    }
+	if (cornersPosition != posn) {
+		cornersPosition = posn;
+		[self setNeedsDisplay];
+	}
 }
 
 
 - (void)setCornerBackgroundColor:(UIColor *)color
 {
-    if (color != cornerBackgroundColor) {
-        [cornerBackgroundColor release];
-        cornerBackgroundColor = [color retain];
-        [self setNeedsDisplay];
-    }
+	if (color != cornerBackgroundColor) {
+		cornerBackgroundColor = color;
+		[self setNeedsDisplay];
+	}
 }
 
 
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.h	Thu Aug 13 13:41:50 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.h	Fri Aug 14 01:55:42 2015 +0200
@@ -10,11 +10,11 @@
 
 @class MGSplitViewController;
 @interface MGSplitDividerView : UIView {
-    MGSplitViewController *splitViewController;
-    BOOL allowsDragging;
+	MGSplitViewController *__unsafe_unretained splitViewController;
+	BOOL allowsDragging;
 }
 
-@property (nonatomic, assign) MGSplitViewController *splitViewController; // weak ref.
+@property (nonatomic, unsafe_unretained) MGSplitViewController *splitViewController; // weak ref.
 @property (nonatomic, assign) BOOL allowsDragging;
 
 - (void)drawGripThumbInRect:(CGRect)rect;
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m	Thu Aug 13 13:41:50 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitDividerView.m	Fri Aug 14 01:55:42 2015 +0200
@@ -19,18 +19,19 @@
 
 - (id)initWithFrame:(CGRect)frame
 {
-    if ((self = [super initWithFrame:frame])) {
-        self.userInteractionEnabled = NO;
-        self.allowsDragging = NO;
-        self.contentMode = UIViewContentModeRedraw;
-    }
-    return self;
+	if ((self = [super initWithFrame:frame])) {
+		self.userInteractionEnabled = NO;
+		self.allowsDragging = NO;
+		self.contentMode = UIViewContentModeRedraw;
+	}
+	return self;
 }
 
 
 - (void)dealloc
 {
-    self.splitViewController = nil;
+	self.splitViewController = nil;
+    
     [super dealloc];
 }
 
@@ -41,139 +42,139 @@
 
 - (void)drawRect:(CGRect)rect
 {
-    if (splitViewController.dividerStyle == MGSplitViewDividerStyleThin) {
-        [super drawRect:rect];
-
-    } else if (splitViewController.dividerStyle == MGSplitViewDividerStylePaneSplitter) {
-        // Draw gradient background.
-        CGRect bounds = self.bounds;
-        CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
-        CGFloat locations[2] = {0, 1};
-        CGFloat components[8] = {   0.988, 0.988, 0.988, 1.0,  // light
-                                    0.875, 0.875, 0.875, 1.0 };// dark
-        CGGradientRef gradient = CGGradientCreateWithColorComponents (rgb, components, locations, 2);
-        CGContextRef context = UIGraphicsGetCurrentContext();
-        CGPoint start, end;
-        if (splitViewController.vertical) {
-            // Light left to dark right.
-            start = CGPointMake(CGRectGetMinX(bounds), CGRectGetMidY(bounds));
-            end = CGPointMake(CGRectGetMaxX(bounds), CGRectGetMidY(bounds));
-        } else {
-            // Light top to dark bottom.
-            start = CGPointMake(CGRectGetMidX(bounds), CGRectGetMinY(bounds));
-            end = CGPointMake(CGRectGetMidX(bounds), CGRectGetMaxY(bounds));
-        }
-        CGContextDrawLinearGradient(context, gradient, start, end, 0);
-        CGColorSpaceRelease(rgb);
-        CGGradientRelease(gradient);
-
-        // Draw borders.
-        float borderThickness = 1.0;
-        [[UIColor colorWithWhite:0.7 alpha:1.0] set];
-        CGRect borderRect = bounds;
-        if (splitViewController.vertical) {
-            borderRect.size.width = borderThickness;
-            UIRectFill(borderRect);
-            borderRect.origin.x = CGRectGetMaxX(bounds) - borderThickness;
-            UIRectFill(borderRect);
-
-        } else {
-            borderRect.size.height = borderThickness;
-            UIRectFill(borderRect);
-            borderRect.origin.y = CGRectGetMaxY(bounds) - borderThickness;
-            UIRectFill(borderRect);
-        }
-
-        // Draw grip.
-        [self drawGripThumbInRect:bounds];
-    }
+	if (splitViewController.dividerStyle == MGSplitViewDividerStyleThin) {
+		[super drawRect:rect];
+		
+	} else if (splitViewController.dividerStyle == MGSplitViewDividerStylePaneSplitter) {
+		// Draw gradient background.
+		CGRect bounds = self.bounds;
+		CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
+		CGFloat locations[2] = {0, 1};
+		CGFloat components[8] = {	0.988f, 0.988f, 0.988f, 1.0,  // light
+									0.875, 0.875, 0.875, 1.0 };// dark
+		CGGradientRef gradient = CGGradientCreateWithColorComponents (rgb, components, locations, 2);
+		CGContextRef context = UIGraphicsGetCurrentContext();
+		CGPoint start, end;
+		if (splitViewController.vertical) {
+			// Light left to dark right.
+			start = CGPointMake(CGRectGetMinX(bounds), CGRectGetMidY(bounds));
+			end = CGPointMake(CGRectGetMaxX(bounds), CGRectGetMidY(bounds));
+		} else {
+			// Light top to dark bottom.
+			start = CGPointMake(CGRectGetMidX(bounds), CGRectGetMinY(bounds));
+			end = CGPointMake(CGRectGetMidX(bounds), CGRectGetMaxY(bounds));
+		}
+		CGContextDrawLinearGradient(context, gradient, start, end, 0);
+		CGColorSpaceRelease(rgb);
+		CGGradientRelease(gradient);
+		
+		// Draw borders.
+		float borderThickness = 1.0;
+		[[UIColor colorWithWhite:0.7f alpha:1.0] set];
+		CGRect borderRect = bounds;
+		if (splitViewController.vertical) {
+			borderRect.size.width = borderThickness;
+			UIRectFill(borderRect);
+			borderRect.origin.x = CGRectGetMaxX(bounds) - borderThickness;
+			UIRectFill(borderRect);
+			
+		} else {
+			borderRect.size.height = borderThickness;
+			UIRectFill(borderRect);
+			borderRect.origin.y = CGRectGetMaxY(bounds) - borderThickness;
+			UIRectFill(borderRect);
+		}
+		
+		// Draw grip.
+		[self drawGripThumbInRect:bounds];
+	}
 }
 
 
 - (void)drawGripThumbInRect:(CGRect)rect
 {
-    float width = 9.0;
-    float height;
-    if (splitViewController.vertical) {
-        height = 30.0;
-    } else {
-        height = width;
-        width = 30.0;
-    }
-
-    // Draw grip in centred in rect.
-    CGRect gripRect = CGRectMake(0, 0, width, height);
-    gripRect.origin.x = ((rect.size.width - gripRect.size.width) / 2.0);
-    gripRect.origin.y = ((rect.size.height - gripRect.size.height) / 2.0);
-
-    float stripThickness = 1.0;
-    UIColor *stripColor = [UIColor colorWithWhite:0.35 alpha:1.0];
-    UIColor *lightColor = [UIColor colorWithWhite:1.0 alpha:1.0];
-    float space = 3.0;
-    if (splitViewController.vertical) {
-        gripRect.size.width = stripThickness;
-        [stripColor set];
-        UIRectFill(gripRect);
-
-        gripRect.origin.x += stripThickness;
-        gripRect.origin.y += 1;
-        [lightColor set];
-        UIRectFill(gripRect);
-        gripRect.origin.x -= stripThickness;
-        gripRect.origin.y -= 1;
-
-        gripRect.origin.x += space + stripThickness;
-        [stripColor set];
-        UIRectFill(gripRect);
-
-        gripRect.origin.x += stripThickness;
-        gripRect.origin.y += 1;
-        [lightColor set];
-        UIRectFill(gripRect);
-        gripRect.origin.x -= stripThickness;
-        gripRect.origin.y -= 1;
-
-        gripRect.origin.x += space + stripThickness;
-        [stripColor set];
-        UIRectFill(gripRect);
-
-        gripRect.origin.x += stripThickness;
-        gripRect.origin.y += 1;
-        [lightColor set];
-        UIRectFill(gripRect);
-
-    } else {
-        gripRect.size.height = stripThickness;
-        [stripColor set];
-        UIRectFill(gripRect);
-
-        gripRect.origin.y += stripThickness;
-        gripRect.origin.x -= 1;
-        [lightColor set];
-        UIRectFill(gripRect);
-        gripRect.origin.y -= stripThickness;
-        gripRect.origin.x += 1;
-
-        gripRect.origin.y += space + stripThickness;
-        [stripColor set];
-        UIRectFill(gripRect);
-
-        gripRect.origin.y += stripThickness;
-        gripRect.origin.x -= 1;
-        [lightColor set];
-        UIRectFill(gripRect);
-        gripRect.origin.y -= stripThickness;
-        gripRect.origin.x += 1;
-
-        gripRect.origin.y += space + stripThickness;
-        [stripColor set];
-        UIRectFill(gripRect);
-
-        gripRect.origin.y += stripThickness;
-        gripRect.origin.x -= 1;
-        [lightColor set];
-        UIRectFill(gripRect);
-    }
+	float width = 9.0;
+	float height;
+	if (splitViewController.vertical) {
+		height = 30.0;
+	} else {
+		height = width;
+		width = 30.0;
+	}
+	
+	// Draw grip in centred in rect.
+	CGRect gripRect = CGRectMake(0, 0, width, height);
+	gripRect.origin.x = ((rect.size.width - gripRect.size.width) / 2.f);
+	gripRect.origin.y = ((rect.size.height - gripRect.size.height) / 2.f);
+	
+	float stripThickness = 1.0;
+	UIColor *stripColor = [UIColor colorWithWhite:0.35f alpha:1.0];
+	UIColor *lightColor = [UIColor colorWithWhite:1.0 alpha:1.0];
+	float space = 3.0;
+	if (splitViewController.vertical) {
+		gripRect.size.width = stripThickness;
+		[stripColor set];
+		UIRectFill(gripRect);
+		
+		gripRect.origin.x += stripThickness;
+		gripRect.origin.y += 1;
+		[lightColor set];
+		UIRectFill(gripRect);
+		gripRect.origin.x -= stripThickness;
+		gripRect.origin.y -= 1;
+		
+		gripRect.origin.x += space + stripThickness;
+		[stripColor set];
+		UIRectFill(gripRect);
+		
+		gripRect.origin.x += stripThickness;
+		gripRect.origin.y += 1;
+		[lightColor set];
+		UIRectFill(gripRect);
+		gripRect.origin.x -= stripThickness;
+		gripRect.origin.y -= 1;
+		
+		gripRect.origin.x += space + stripThickness;
+		[stripColor set];
+		UIRectFill(gripRect);
+		
+		gripRect.origin.x += stripThickness;
+		gripRect.origin.y += 1;
+		[lightColor set];
+		UIRectFill(gripRect);
+		
+	} else {
+		gripRect.size.height = stripThickness;
+		[stripColor set];
+		UIRectFill(gripRect);
+		
+		gripRect.origin.y += stripThickness;
+		gripRect.origin.x -= 1;
+		[lightColor set];
+		UIRectFill(gripRect);
+		gripRect.origin.y -= stripThickness;
+		gripRect.origin.x += 1;
+		
+		gripRect.origin.y += space + stripThickness;
+		[stripColor set];
+		UIRectFill(gripRect);
+		
+		gripRect.origin.y += stripThickness;
+		gripRect.origin.x -= 1;
+		[lightColor set];
+		UIRectFill(gripRect);
+		gripRect.origin.y -= stripThickness;
+		gripRect.origin.x += 1;
+		
+		gripRect.origin.y += space + stripThickness;
+		[stripColor set];
+		UIRectFill(gripRect);
+		
+		gripRect.origin.y += stripThickness;
+		gripRect.origin.x -= 1;
+		[lightColor set];
+		UIRectFill(gripRect);
+	}
 }
 
 
@@ -183,16 +184,16 @@
 
 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
 {
-    UITouch *touch = [touches anyObject];
-    if (touch) {
-        CGPoint lastPt = [touch previousLocationInView:self];
-        CGPoint pt = [touch locationInView:self];
-        float offset = (splitViewController.vertical) ? pt.x - lastPt.x : pt.y - lastPt.y;
-        if (!splitViewController.masterBeforeDetail) {
-            offset = -offset;
-        }
-        splitViewController.splitPosition = splitViewController.splitPosition + offset;
-    }
+	UITouch *touch = [touches anyObject];
+	if (touch) {
+		CGPoint lastPt = [touch previousLocationInView:self];
+		CGPoint pt = [touch locationInView:self];
+		float offset = (splitViewController.vertical) ? pt.x - lastPt.x : pt.y - lastPt.y;
+		if (!splitViewController.masterBeforeDetail) {
+			offset = -offset;
+		}
+		splitViewController.splitPosition = splitViewController.splitPosition + offset;
+	}
 }
 
 
@@ -202,10 +203,10 @@
 
 - (void)setAllowsDragging:(BOOL)flag
 {
-    if (flag != allowsDragging) {
-        allowsDragging = flag;
-        self.userInteractionEnabled = allowsDragging;
-    }
+	if (flag != allowsDragging) {
+		allowsDragging = flag;
+		self.userInteractionEnabled = allowsDragging;
+	}
 }
 
 
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.h	Thu Aug 13 13:41:50 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.h	Fri Aug 14 01:55:42 2015 +0200
@@ -9,31 +9,32 @@
 #import <UIKit/UIKit.h>
 
 typedef enum _MGSplitViewDividerStyle {
-    // These names have been chosen to be conceptually similar to those of NSSplitView on Mac OS X.
-    MGSplitViewDividerStyleThin         = 0, // Thin divider, like UISplitViewController (default).
-    MGSplitViewDividerStylePaneSplitter = 1  // Thick divider, drawn with a grey gradient and a grab-strip.
+	// These names have been chosen to be conceptually similar to those of NSSplitView on Mac OS X.
+	MGSplitViewDividerStyleThin			= 0, // Thin divider, like UISplitViewController (default).
+	MGSplitViewDividerStylePaneSplitter	= 1  // Thick divider, drawn with a grey gradient and a grab-strip.
 } MGSplitViewDividerStyle;
 
 @class MGSplitDividerView;
 @protocol MGSplitViewControllerDelegate;
 @interface MGSplitViewController : UIViewController <UIPopoverControllerDelegate> {
-    BOOL _showsMasterInPortrait;
-    BOOL _showsMasterInLandscape;
-    float _splitWidth;
-    id _delegate;
-    BOOL _vertical;
-    BOOL _masterBeforeDetail;
-    NSMutableArray *_viewControllers;
-    UIBarButtonItem *_barButtonItem; // To be compliant with wacky UISplitViewController behaviour.
+	BOOL _showsMasterInPortrait;
+	BOOL _showsMasterInLandscape;
+	float _splitWidth;
+	id _delegate;
+	BOOL _vertical;
+	BOOL _masterBeforeDetail;
+	NSMutableArray *_viewControllers;
+	UIBarButtonItem *_barButtonItem; // To be compliant with wacky UISplitViewController behaviour.
     UIPopoverController *_hiddenPopoverController; // Popover used to hold the master view if it's not always visible.
-    MGSplitDividerView *_dividerView; // View that draws the divider between the master and detail views.
-    NSArray *_cornerViews; // Views to draw the inner rounded corners between master and detail views.
-    float _splitPosition;
-    BOOL _reconfigurePopup;
-    MGSplitViewDividerStyle _dividerStyle; // Meta-setting which configures several aspects of appearance and behaviour.
+	MGSplitDividerView *_dividerView; // View that draws the divider between the master and detail views.
+	NSArray *_cornerViews; // Views to draw the inner rounded corners between master and detail views.
+	float _splitPosition;
+	BOOL _reconfigurePopup;
+	MGSplitViewDividerStyle _dividerStyle; // Meta-setting which configures several aspects of appearance and behaviour.
+	BOOL togglesMasterPopover;
 }
 
-@property (nonatomic, assign) IBOutlet id <MGSplitViewControllerDelegate> delegate;
+@property (nonatomic, unsafe_unretained) IBOutlet id <MGSplitViewControllerDelegate> delegate;
 @property (nonatomic, assign) BOOL showsMasterInPortrait; // applies to both portrait orientations (default NO)
 @property (nonatomic, assign) BOOL showsMasterInLandscape; // applies to both landscape orientations (default YES)
 @property (nonatomic, assign, getter=isVertical) BOOL vertical; // if NO, split is horizontal, i.e. master above detail (default YES)
@@ -43,31 +44,34 @@
 @property (nonatomic, assign) BOOL allowsDraggingDivider; // whether to let the user drag the divider to alter the split position (default NO).
 
 @property (nonatomic, copy) NSArray *viewControllers; // array of UIViewControllers; master is at index 0, detail is at index 1.
-@property (nonatomic, retain) IBOutlet UIViewController *masterViewController; // convenience.
-@property (nonatomic, retain) IBOutlet UIViewController *detailViewController; // convenience.
-@property (nonatomic, retain) MGSplitDividerView *dividerView; // the view which draws the divider/split between master and detail.
+@property (nonatomic, strong) IBOutlet UIViewController *masterViewController; // convenience.
+@property (nonatomic, strong) IBOutlet UIViewController *detailViewController; // convenience.
+@property (nonatomic, strong) MGSplitDividerView *dividerView; // the view which draws the divider/split between master and detail.
 @property (nonatomic, assign) MGSplitViewDividerStyle dividerStyle; // style (and behaviour) of the divider between master and detail.
 
 @property (nonatomic, readonly, getter=isLandscape) BOOL landscape; // returns YES if this view controller is in either of the two Landscape orientations, else NO.
 
+@property (nonatomic, readwrite) BOOL togglesMasterPopover; // default is NO.
+
 // Actions
 - (IBAction)toggleSplitOrientation:(id)sender; // toggles split axis between vertical (left/right; default) and horizontal (top/bottom).
 - (IBAction)toggleMasterBeforeDetail:(id)sender; // toggles position of master view relative to detail view.
 - (IBAction)toggleMasterView:(id)sender; // toggles display of the master view in the current orientation.
 - (IBAction)showMasterPopover:(id)sender; // shows the master view in a popover spawned from the provided barButtonItem, if it's currently hidden.
+- (IBAction)hideMasterPopover:(id)sender; // hides the master view in a popover spawned from the provided barButtonItem, if it's currently shown.
 - (void)notePopoverDismissed; // should rarely be needed, because you should not change the popover's delegate. If you must, then call this when it's dismissed.
 
 // Conveniences for you, because I care.
 - (BOOL)isShowingMaster;
 - (void)setSplitPosition:(float)posn animated:(BOOL)animate; // Allows for animation of splitPosition changes. The property's regular setter is not animated.
-/* Note:    splitPosition is the width (in a left/right split, or height in a top/bottom split) of the master view.
-            It is relative to the appropriate side of the splitView, which can be any of the four sides depending on the values in isMasterBeforeDetail and isVertical:
-                isVertical = YES, isMasterBeforeDetail = YES: splitPosition is relative to the LEFT edge. (Default)
-                isVertical = YES, isMasterBeforeDetail = NO: splitPosition is relative to the RIGHT edge.
-                isVertical = NO, isMasterBeforeDetail = YES: splitPosition is relative to the TOP edge.
-                isVertical = NO, isMasterBeforeDetail = NO: splitPosition is relative to the BOTTOM edge.
+/* Note:	splitPosition is the width (in a left/right split, or height in a top/bottom split) of the master view.
+			It is relative to the appropriate side of the splitView, which can be any of the four sides depending on the values in isMasterBeforeDetail and isVertical:
+				isVertical = YES, isMasterBeforeDetail = YES: splitPosition is relative to the LEFT edge. (Default)
+				isVertical = YES, isMasterBeforeDetail = NO: splitPosition is relative to the RIGHT edge.
+ 				isVertical = NO, isMasterBeforeDetail = YES: splitPosition is relative to the TOP edge.
+ 				isVertical = NO, isMasterBeforeDetail = NO: splitPosition is relative to the BOTTOM edge.
 
-            This implementation was chosen so you don't need to recalculate equivalent splitPositions if the user toggles masterBeforeDetail themselves.
+			This implementation was chosen so you don't need to recalculate equivalent splitPositions if the user toggles masterBeforeDetail themselves.
  */
 - (void)setDividerStyle:(MGSplitViewDividerStyle)newStyle animated:(BOOL)animate; // Allows for animation of dividerStyle changes. The property's regular setter is not animated.
 - (NSArray *)cornerViews;
@@ -76,8 +80,8 @@
  The first view is the "leading" corners (top edge of screen for left/right split, left edge of screen for top/bottom split).
  The second view is the "trailing" corners (bottom edge of screen for left/right split, right edge of screen for top/bottom split).
  Do NOT modify them, except to:
-    1. Change their .cornerBackgroundColor
-    2. Change their .cornerRadius
+	1. Change their .cornerBackgroundColor
+	2. Change their .cornerRadius
  */
 
 @end
@@ -88,21 +92,26 @@
 @optional
 
 // Called when a button should be added to a toolbar for a hidden view controller.
-- (void)splitViewController:(MGSplitViewController*)svc
-     willHideViewController:(UIViewController *)aViewController
-          withBarButtonItem:(UIBarButtonItem*)barButtonItem
-       forPopoverController: (UIPopoverController*)pc;
+- (void)splitViewController:(MGSplitViewController*)svc 
+	 willHideViewController:(UIViewController *)aViewController 
+		  withBarButtonItem:(UIBarButtonItem*)barButtonItem 
+	   forPopoverController: (UIPopoverController*)pc;
 
 // Called when the master view is shown again in the split view, invalidating the button and popover controller.
-- (void)splitViewController:(MGSplitViewController*)svc
-     willShowViewController:(UIViewController *)aViewController
+- (void)splitViewController:(MGSplitViewController*)svc 
+	 willShowViewController:(UIViewController *)aViewController 
   invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem;
 
 // Called when the master view is shown in a popover, so the delegate can take action like hiding other popovers.
-- (void)splitViewController:(MGSplitViewController*)svc
-          popoverController:(UIPopoverController*)pc
+- (void)splitViewController:(MGSplitViewController*)svc 
+		  popoverController:(UIPopoverController*)pc 
   willPresentViewController:(UIViewController *)aViewController;
 
+// Called when a popover containing the master view is going to be hidden so the delegate can take action like showing other popovers.  This only happens if togglesMasterPopover is set to YES.
+- (void)splitViewController:(MGSplitViewController*)svc 
+		  popoverController:(UIPopoverController*)pc 
+  willDismissViewController:(UIViewController *)aViewController;
+
 // Called when the split orientation will change (from vertical to horizontal, or vice versa).
 - (void)splitViewController:(MGSplitViewController*)svc willChangeSplitOrientationToVertical:(BOOL)isVertical;
 
--- a/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m	Thu Aug 13 13:41:50 2015 +0200
+++ b/project_files/HedgewarsMobile/Classes/MGSplitViewController/MGSplitViewController.m	Fri Aug 14 01:55:42 2015 +0200
@@ -10,19 +10,18 @@
 #import "MGSplitDividerView.h"
 #import "MGSplitCornersView.h"
 
-#define MG_DEFAULT_SPLIT_POSITION       320.0   // default width of master view in UISplitViewController.
-#define MG_DEFAULT_SPLIT_WIDTH          1.0     // default width of split-gutter in UISplitViewController.
-#define MG_DEFAULT_CORNER_RADIUS        5.0     // default corner-radius of overlapping split-inner corners on the master and detail views.
-#define MG_DEFAULT_CORNER_COLOR         [UIColor blackColor]    // default color of intruding inner corners (and divider background).
+#define MG_DEFAULT_SPLIT_POSITION		320.0	// default width of master view in UISplitViewController.
+#define MG_DEFAULT_SPLIT_WIDTH			1.0		// default width of split-gutter in UISplitViewController.
+#define MG_DEFAULT_CORNER_RADIUS		5.0		// default corner-radius of overlapping split-inner corners on the master and detail views.
+#define MG_DEFAULT_CORNER_COLOR			[UIColor blackColor]	// default color of intruding inner corners (and divider background).
 
-#define MG_PANESPLITTER_CORNER_RADIUS   0.0     // corner-radius of split-inner corners for MGSplitViewDividerStylePaneSplitter style.
-#define MG_PANESPLITTER_SPLIT_WIDTH     25.0    // width of split-gutter for MGSplitViewDividerStylePaneSplitter style.
+#define MG_PANESPLITTER_CORNER_RADIUS	0.0		// corner-radius of split-inner corners for MGSplitViewDividerStylePaneSplitter style.
+#define MG_PANESPLITTER_SPLIT_WIDTH		25.0	// width of split-gutter for MGSplitViewDividerStylePaneSplitter style.
 
-#define MG_MIN_VIEW_WIDTH               200.0   // minimum width a view is allowed to become as a result of changing the splitPosition.
+#define MG_MIN_VIEW_WIDTH				200.0	// minimum width a view is allowed to become as a result of changing the splitPosition.
 
-#define MG_ANIMATION_CHANGE_SPLIT_ORIENTATION   @"ChangeSplitOrientation"   // Animation ID for internal use.
-#define MG_ANIMATION_CHANGE_SUBVIEWS_ORDER      @"ChangeSubviewsOrder"  // Animation ID for internal use.
-
+#define MG_ANIMATION_CHANGE_SPLIT_ORIENTATION	@"ChangeSplitOrientation"	// Animation ID for internal use.
+#define MG_ANIMATION_CHANGE_SUBVIEWS_ORDER		@"ChangeSubviewsOrder"	// Animation ID for internal use.
 
 @interface MGSplitViewController (MGPrivateMethods)
 
@@ -48,50 +47,50 @@
 
 - (NSString *)nameOfInterfaceOrientation:(UIInterfaceOrientation)theOrientation
 {
-    NSString *orientationName = nil;
-    switch (theOrientation) {
-        case UIInterfaceOrientationPortrait:
-            orientationName = @"Portrait"; // Home button at bottom
-            break;
-        case UIInterfaceOrientationPortraitUpsideDown:
-            orientationName = @"Portrait (Upside Down)"; // Home button at top
-            break;
-        case UIInterfaceOrientationLandscapeLeft:
-            orientationName = @"Landscape (Left)"; // Home button on left
-            break;
-        case UIInterfaceOrientationLandscapeRight:
-            orientationName = @"Landscape (Right)"; // Home button on right
-            break;
-        default:
-            break;
-    }
-
-    return orientationName;
+	NSString *orientationName = nil;
+	switch (theOrientation) {
+		case UIInterfaceOrientationPortrait:
+			orientationName = @"Portrait"; // Home button at bottom
+			break;
+		case UIInterfaceOrientationPortraitUpsideDown:
+			orientationName = @"Portrait (Upside Down)"; // Home button at top
+			break;
+		case UIInterfaceOrientationLandscapeLeft:
+			orientationName = @"Landscape (Left)"; // Home button on left
+			break;
+		case UIInterfaceOrientationLandscapeRight:
+			orientationName = @"Landscape (Right)"; // Home button on right
+			break;
+		default:
+			break;
+	}
+	
+	return orientationName;
 }
 
 
 - (BOOL)isLandscape
 {
-    return UIInterfaceOrientationIsLandscape(self.interfaceOrientation);
+	return UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]);
 }
 
 
 - (BOOL)shouldShowMasterForInterfaceOrientation:(UIInterfaceOrientation)theOrientation
 {
-    // Returns YES if master view should be shown directly embedded in the splitview, instead of hidden in a popover.
-    return ((UIInterfaceOrientationIsLandscape(theOrientation)) ? _showsMasterInLandscape : _showsMasterInPortrait);
+	// Returns YES if master view should be shown directly embedded in the splitview, instead of hidden in a popover.
+	return ((UIInterfaceOrientationIsLandscape(theOrientation)) ? _showsMasterInLandscape : _showsMasterInPortrait);
 }
 
 
 - (BOOL)shouldShowMaster
 {
-    return [self shouldShowMasterForInterfaceOrientation:self.interfaceOrientation];
+	return [self shouldShowMasterForInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation]];
 }
 
 
 - (BOOL)isShowingMaster
 {
-    return [self shouldShowMaster] && self.masterViewController && self.masterViewController.view && ([self.masterViewController.view superview] == self.view);
+	return [self shouldShowMaster] && self.masterViewController && self.masterViewController.view && ([self.masterViewController.view superview] == self.view);
 }
 
 
@@ -101,60 +100,59 @@
 
 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
 {
-    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
-        [self setup];
-    }
-
-    return self;
+	if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
+		[self setup];
+	}
+	
+	return self;
 }
 
 
 - (id)initWithCoder:(NSCoder *)aDecoder
 {
-    if ((self = [super initWithCoder:aDecoder])) {
-        [self setup];
-    }
-
-    return self;
+	if ((self = [super initWithCoder:aDecoder])) {
+		[self setup];
+	}
+	
+	return self;
 }
 
 
 - (void)setup
 {
-    // Configure default behaviour.
-    _viewControllers = [[NSMutableArray alloc] initWithObjects:[NSNull null], [NSNull null], nil];
-    _splitWidth = MG_DEFAULT_SPLIT_WIDTH;
-    _showsMasterInPortrait = NO;
-    _showsMasterInLandscape = YES;
-    _reconfigurePopup = NO;
-    _vertical = YES;
-    _masterBeforeDetail = YES;
-    _splitPosition = MG_DEFAULT_SPLIT_POSITION;
-    CGRect divRect = self.view.bounds;
-    if ([self isVertical]) {
-        divRect.origin.y = _splitPosition;
-        divRect.size.height = _splitWidth;
-    } else {
-        divRect.origin.x = _splitPosition;
-        divRect.size.width = _splitWidth;
-    }
-    _dividerView = [[MGSplitDividerView alloc] initWithFrame:divRect];
-    _dividerView.splitViewController = self;
-    _dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR;
-    _dividerStyle = MGSplitViewDividerStyleThin;
+	// Configure default behaviour.
+	_viewControllers = [[NSMutableArray alloc] initWithObjects:[NSNull null], [NSNull null], nil];
+	_splitWidth = MG_DEFAULT_SPLIT_WIDTH;
+	_showsMasterInPortrait = NO;
+	_showsMasterInLandscape = YES;
+	_reconfigurePopup = NO;
+	_vertical = YES;
+	_masterBeforeDetail = YES;
+	_splitPosition = MG_DEFAULT_SPLIT_POSITION;
+	CGRect divRect = self.view.bounds;
+	if ([self isVertical]) {
+		divRect.origin.y = _splitPosition;
+		divRect.size.height = _splitWidth;
+	} else {
+		divRect.origin.x = _splitPosition;
+		divRect.size.width = _splitWidth;
+	}
+	_dividerView = [[MGSplitDividerView alloc] initWithFrame:divRect];
+	_dividerView.splitViewController = self;
+	_dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR;
+	_dividerStyle = MGSplitViewDividerStyleThin;
+
+    // fix for iOS 6 layout
+    self.view.autoresizesSubviews = NO;
 }
 
 
 - (void)dealloc
 {
-    _delegate = nil;
-    [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
-    [_viewControllers release];
-    [_barButtonItem release];
-    [_hiddenPopoverController release];
-    [_dividerView release];
-    [_cornerViews release];
-
+	_delegate = nil;
+	_viewControllers = nil;
+	[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
+    
     [super dealloc];
 }
 
@@ -165,377 +163,370 @@
 
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
 {
+    if (self.detailViewController)
+    {
+        return [self.detailViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
+    }
+
     return YES;
 }
 
 
 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
 {
-    [self.masterViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
-    [self.detailViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
+	[self.masterViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
+	[self.detailViewController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
 }
 
 
 - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
 {
-    [self.masterViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
-    [self.detailViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
+	[self.masterViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
+	[self.detailViewController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
 }
 
 
-- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
-                                         duration:(NSTimeInterval)duration
+- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
+										 duration:(NSTimeInterval)duration
 {
-    [self.masterViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
-    [self.detailViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
-
-    // Hide popover.
-    if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
-        [_hiddenPopoverController dismissPopoverAnimated:NO];
-    }
-
-    // Re-tile views.
-    _reconfigurePopup = YES;
-    [self layoutSubviewsForInterfaceOrientation:toInterfaceOrientation withAnimation:YES];
-}
-
-
-- (void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
-{
-    [self.masterViewController willAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
-    [self.detailViewController willAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
-}
-
-
-- (void)didAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
-{
-    [self.masterViewController didAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation];
-    [self.detailViewController didAnimateFirstHalfOfRotationToInterfaceOrientation:toInterfaceOrientation];
-}
-
-
-- (void)willAnimateSecondHalfOfRotationFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation duration:(NSTimeInterval)duration
-{
-    [self.masterViewController willAnimateSecondHalfOfRotationFromInterfaceOrientation:fromInterfaceOrientation duration:duration];
-    [self.detailViewController willAnimateSecondHalfOfRotationFromInterfaceOrientation:fromInterfaceOrientation duration:duration];
+	[self.masterViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
+	[self.detailViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
+	
+	// Hide popover.
+	if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+		[_hiddenPopoverController dismissPopoverAnimated:NO];
+	}
+	
+	// Re-tile views.
+	_reconfigurePopup = YES;
+	[self layoutSubviewsForInterfaceOrientation:toInterfaceOrientation withAnimation:YES];
 }
 
 
 - (CGSize)splitViewSizeForOrientation:(UIInterfaceOrientation)theOrientation
 {
-    UIScreen *screen = [UIScreen mainScreen];
-    CGRect fullScreenRect = screen.bounds; // always implicitly in Portrait orientation.
-    CGRect appFrame = screen.applicationFrame;
-
-    // Find status bar height by checking which dimension of the applicationFrame is narrower than screen bounds.
-    // Little bit ugly looking, but it'll still work even if they change the status bar height in future.
-    float statusBarHeight = MAX((fullScreenRect.size.width - appFrame.size.width), (fullScreenRect.size.height - appFrame.size.height));
-
-    // Initially assume portrait orientation.
-    float width = fullScreenRect.size.width;
-    float height = fullScreenRect.size.height;
-
-    // Correct for orientation.
-    if (UIInterfaceOrientationIsLandscape(theOrientation)) {
-        width = height;
-        height = fullScreenRect.size.width;
+	UIScreen *screen = [UIScreen mainScreen];
+	CGRect fullScreenRect = screen.bounds; // always implicitly in Portrait orientation.
+	CGRect appFrame = screen.applicationFrame;
+	
+	// Find status bar height by checking which dimension of the applicationFrame is narrower than screen bounds.
+	// Little bit ugly looking, but it'll still work even if they change the status bar height in future.
+	float statusBarHeight = MAX((fullScreenRect.size.width - appFrame.size.width), (fullScreenRect.size.height - appFrame.size.height));
+    
+    // In iOS 7 the status bar is transparent, so don't adjust for it.
+    if (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0) {
+        statusBarHeight = 0;
     }
-
-    // Account for status bar, which always subtracts from the height (since it's always at the top of the screen).
-    height -= statusBarHeight;
-
-    return CGSizeMake(width, height);
+	
+	float navigationBarHeight = 0;
+	if ((self.navigationController)&&(!self.navigationController.navigationBarHidden)) {
+		navigationBarHeight = self.navigationController.navigationBar.frame.size.height;
+	}
+	
+	// Initially assume portrait orientation.
+	float width = fullScreenRect.size.width;
+	float height = fullScreenRect.size.height;
+	
+    // Correct for orientation (only for iOS7.1 and earlier, since iOS8 it will do it automatically).
+	if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1 && UIInterfaceOrientationIsLandscape(theOrientation)) {
+		width = height;
+		height = fullScreenRect.size.width;
+	}
+	
+	// Account for status bar, which always subtracts from the height (since it's always at the top of the screen).
+	height -= statusBarHeight;
+	height -= navigationBarHeight;
+	
+	return CGSizeMake(width, height);
 }
 
 
 - (void)layoutSubviewsForInterfaceOrientation:(UIInterfaceOrientation)theOrientation withAnimation:(BOOL)animate
 {
-    if (_reconfigurePopup) {
-        [self reconfigureForMasterInPopover:![self shouldShowMasterForInterfaceOrientation:theOrientation]];
-    }
-
-    // Layout the master, detail and divider views appropriately, adding/removing subviews as needed.
-    // First obtain relevant geometry.
-    CGSize fullSize = [self splitViewSizeForOrientation:theOrientation];
-    float width = fullSize.width;
-    float height = fullSize.height;
-
-    if (NO) { // Just for debugging.
-        NSLog(@"Target orientation is %@, dimensions will be %.0f x %.0f",
-              [self nameOfInterfaceOrientation:theOrientation], width, height);
-    }
-
-    // Layout the master, divider and detail views.
-    CGRect newFrame = CGRectMake(0, 0, width, height);
-    UIViewController *controller;
-    UIView *theView;
-    BOOL shouldShowMaster = [self shouldShowMasterForInterfaceOrientation:theOrientation];
-    BOOL masterFirst = [self isMasterBeforeDetail];
-    if ([self isVertical]) {
-        // Master on left, detail on right (or vice versa).
-        CGRect masterRect, dividerRect, detailRect;
-        if (masterFirst) {
-            if (!shouldShowMaster) {
-                // Move off-screen.
-                newFrame.origin.x -= (_splitPosition + _splitWidth);
-            }
-
-            newFrame.size.width = _splitPosition;
-            masterRect = newFrame;
-
-            newFrame.origin.x += newFrame.size.width;
-            newFrame.size.width = _splitWidth;
-            dividerRect = newFrame;
-
-            newFrame.origin.x += newFrame.size.width;
-            newFrame.size.width = width - newFrame.origin.x;
-            detailRect = newFrame;
-
-        } else {
-            if (!shouldShowMaster) {
-                // Move off-screen.
-                newFrame.size.width += (_splitPosition + _splitWidth);
-            }
-
-            newFrame.size.width -= (_splitPosition + _splitWidth);
-            detailRect = newFrame;
-
-            newFrame.origin.x += newFrame.size.width;
-            newFrame.size.width = _splitWidth;
-            dividerRect = newFrame;
-
-            newFrame.origin.x += newFrame.size.width;
-            newFrame.size.width = _splitPosition;
-            masterRect = newFrame;
-        }
-
-        // Position master.
-        controller = self.masterViewController;
-        if (controller && [controller isKindOfClass:[UIViewController class]])  {
-            theView = controller.view;
-            if (theView) {
-                theView.frame = masterRect;
-                if (!theView.superview) {
-                    [controller viewWillAppear:NO];
-                    [self.view addSubview:theView];
-                    [controller viewDidAppear:NO];
-                }
-            }
-        }
-
-        // Position divider.
-        theView = _dividerView;
-        theView.frame = dividerRect;
-        if (!theView.superview) {
-            [self.view addSubview:theView];
-        }
-
-        // Position detail.
-        controller = self.detailViewController;
-        if (controller && [controller isKindOfClass:[UIViewController class]])  {
-            theView = controller.view;
-            if (theView) {
-                theView.frame = detailRect;
-                if (!theView.superview) {
-                    [self.view insertSubview:theView aboveSubview:self.masterViewController.view];
-                } else {
-                    [self.view bringSubviewToFront:theView];
-                }
-            }
-        }
-
-    } else {
-        // Master above, detail below (or vice versa).
-        CGRect masterRect, dividerRect, detailRect;
-        if (masterFirst) {
-            if (!shouldShowMaster) {
-                // Move off-screen.
-                newFrame.origin.y -= (_splitPosition + _splitWidth);
-            }
-
-            newFrame.size.height = _splitPosition;
-            masterRect = newFrame;
-
-            newFrame.origin.y += newFrame.size.height;
-            newFrame.size.height = _splitWidth;
-            dividerRect = newFrame;
-
-            newFrame.origin.y += newFrame.size.height;
-            newFrame.size.height = height - newFrame.origin.y;
-            detailRect = newFrame;
-
-        } else {
-            if (!shouldShowMaster) {
-                // Move off-screen.
-                newFrame.size.height += (_splitPosition + _splitWidth);
-            }
-
-            newFrame.size.height -= (_splitPosition + _splitWidth);
-            detailRect = newFrame;
-
-            newFrame.origin.y += newFrame.size.height;
-            newFrame.size.height = _splitWidth;
-            dividerRect = newFrame;
-
-            newFrame.origin.y += newFrame.size.height;
-            newFrame.size.height = _splitPosition;
-            masterRect = newFrame;
-        }
-
-        // Position master.
-        controller = self.masterViewController;
-        if (controller && [controller isKindOfClass:[UIViewController class]])  {
-            theView = controller.view;
-            if (theView) {
-                theView.frame = masterRect;
-                if (!theView.superview) {
-                    [controller viewWillAppear:NO];
-                    [self.view addSubview:theView];
-                    [controller viewDidAppear:NO];
-                }
-            }
-        }
-
-        // Position divider.
-        theView = _dividerView;
-        theView.frame = dividerRect;
-        if (!theView.superview) {
-            [self.view addSubview:theView];
-        }
-
-        // Position detail.
-        controller = self.detailViewController;
-        if (controller && [controller isKindOfClass:[UIViewController class]])  {
-            theView = controller.view;
-            if (theView) {
-                theView.frame = detailRect;
-                if (!theView.superview) {
-                    [self.view insertSubview:theView aboveSubview:self.masterViewController.view];
-                } else {
-                    [self.view bringSubviewToFront:theView];
-                }
-            }
-        }
-    }
-
-    // Create corner views if necessary.
-    MGSplitCornersView *leadingCorners; // top/left of screen in vertical/horizontal split.
-    MGSplitCornersView *trailingCorners; // bottom/right of screen in vertical/horizontal split.
-    if (!_cornerViews) {
-        CGRect cornerRect = CGRectMake(0, 0, 10, 10); // arbitrary, will be resized below.
-        leadingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect];
-        leadingCorners.splitViewController = self;
-        leadingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR;
-        leadingCorners.cornerRadius = MG_DEFAULT_CORNER_RADIUS;
-        trailingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect];
-        trailingCorners.splitViewController = self;
-        trailingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR;
-        trailingCorners.cornerRadius = MG_DEFAULT_CORNER_RADIUS;
-        _cornerViews = [[NSArray alloc] initWithObjects:leadingCorners, trailingCorners, nil];
-        [leadingCorners release];
-        [trailingCorners release];
-
-    } else if ([_cornerViews count] == 2) {
-        leadingCorners = [_cornerViews objectAtIndex:0];
-        trailingCorners = [_cornerViews objectAtIndex:1];
-    }
-
-    // Configure and layout the corner-views.
-    leadingCorners.cornersPosition = (_vertical) ? MGCornersPositionLeadingVertical : MGCornersPositionLeadingHorizontal;
-    trailingCorners.cornersPosition = (_vertical) ? MGCornersPositionTrailingVertical : MGCornersPositionTrailingHorizontal;
-    leadingCorners.autoresizingMask = (_vertical) ? UIViewAutoresizingFlexibleBottomMargin : UIViewAutoresizingFlexibleRightMargin;
-    trailingCorners.autoresizingMask = (_vertical) ? UIViewAutoresizingFlexibleTopMargin : UIViewAutoresizingFlexibleLeftMargin;
-
-    float x, y, cornersWidth, cornersHeight;
-    CGRect leadingRect, trailingRect;
-    float radius = leadingCorners.cornerRadius;
-    if (_vertical) { // left/right split
-        cornersWidth = (radius * 2.0) + _splitWidth;
-        cornersHeight = radius;
-        x = ((shouldShowMaster) ? ((masterFirst) ? _splitPosition : width - (_splitPosition + _splitWidth)) : (0 - _splitWidth)) - radius;
-        y = 0;
-        leadingRect = CGRectMake(x, y, cornersWidth, cornersHeight); // top corners
-        trailingRect = CGRectMake(x, (height - cornersHeight), cornersWidth, cornersHeight); // bottom corners
-
-    } else { // top/bottom split
-        x = 0;
-        y = ((shouldShowMaster) ? ((masterFirst) ? _splitPosition : height - (_splitPosition + _splitWidth)) : (0 - _splitWidth)) - radius;
-        cornersWidth = radius;
-        cornersHeight = (radius * 2.0) + _splitWidth;
-        leadingRect = CGRectMake(x, y, cornersWidth, cornersHeight); // left corners
-        trailingRect = CGRectMake((width - cornersWidth), y, cornersWidth, cornersHeight); // right corners
-    }
-
-    leadingCorners.frame = leadingRect;
-    trailingCorners.frame = trailingRect;
-
-    // Ensure corners are visible and frontmost.
-    if (!leadingCorners.superview) {
-        [self.view insertSubview:leadingCorners aboveSubview:self.detailViewController.view];
-        [self.view insertSubview:trailingCorners aboveSubview:self.detailViewController.view];
-    } else {
-        [self.view bringSubviewToFront:leadingCorners];
-        [self.view bringSubviewToFront:trailingCorners];
-    }
+	if (_reconfigurePopup) {
+		[self reconfigureForMasterInPopover:![self shouldShowMasterForInterfaceOrientation:theOrientation]];
+	}
+	
+	// Layout the master, detail and divider views appropriately, adding/removing subviews as needed.
+	// First obtain relevant geometry.
+	CGSize fullSize = [self splitViewSizeForOrientation:theOrientation];
+	float width = fullSize.width;
+	float height = fullSize.height;
+	
+	if (NO) { // Just for debugging.
+		NSLog(@"Target orientation is %@, dimensions will be %.0f x %.0f", 
+			  [self nameOfInterfaceOrientation:theOrientation], width, height);
+	}
+	
+	// Layout the master, divider and detail views.
+	CGRect newFrame = CGRectMake(0, 0, width, height);
+	UIViewController *controller;
+	UIView *theView;
+	BOOL shouldShowMaster = [self shouldShowMasterForInterfaceOrientation:theOrientation];
+	BOOL masterFirst = [self isMasterBeforeDetail];
+	if ([self isVertical]) {
+		// Master on left, detail on right (or vice versa).
+		CGRect masterRect, dividerRect, detailRect;
+		if (masterFirst) {
+			if (!shouldShowMaster) {
+				// Move off-screen.
+				newFrame.origin.x -= (_splitPosition + _splitWidth);
+			}
+			
+			newFrame.size.width = _splitPosition;
+			masterRect = newFrame;
+			
+			newFrame.origin.x += newFrame.size.width;
+			newFrame.size.width = _splitWidth;
+			dividerRect = newFrame;
+			
+			newFrame.origin.x += newFrame.size.width;
+			newFrame.size.width = width - newFrame.origin.x;
+			detailRect = newFrame;
+			
+		} else {
+			if (!shouldShowMaster) {
+				// Move off-screen.
+				newFrame.size.width += (_splitPosition + _splitWidth);
+			}
+			
+			newFrame.size.width -= (_splitPosition + _splitWidth);
+			detailRect = newFrame;
+			
+			newFrame.origin.x += newFrame.size.width;
+			newFrame.size.width = _splitWidth;
+			dividerRect = newFrame;
+			
+			newFrame.origin.x += newFrame.size.width;
+			newFrame.size.width = _splitPosition;
+			masterRect = newFrame;
+		}
+		
+		// Position master.
+		controller = self.masterViewController;
+		if (controller && [controller isKindOfClass:[UIViewController class]])  {
+			theView = controller.view;
+			if (theView) {
+				theView.frame = masterRect;
+				if (!theView.superview) {
+					[controller viewWillAppear:NO];
+					[self.view addSubview:theView];
+					[controller viewDidAppear:NO];
+				}
+			}
+		}
+		
+		// Position divider.
+		theView = _dividerView;
+		theView.frame = dividerRect;
+		if (!theView.superview) {
+			[self.view addSubview:theView];
+		}
+		
+		// Position detail.
+		controller = self.detailViewController;
+		if (controller && [controller isKindOfClass:[UIViewController class]])  {
+			theView = controller.view;
+			if (theView) {
+				theView.frame = detailRect;
+				if (!theView.superview) {
+					[self.view insertSubview:theView aboveSubview:self.masterViewController.view];
+				} else {
+					[self.view bringSubviewToFront:theView];
+				}
+			}
+		}
+		
+	} else {
+		// Master above, detail below (or vice versa).
+		CGRect masterRect, dividerRect, detailRect;
+		if (masterFirst) {
+			if (!shouldShowMaster) {
+				// Move off-screen.
+				newFrame.origin.y -= (_splitPosition + _splitWidth);
+			}
+			
+			newFrame.size.height = _splitPosition;
+			masterRect = newFrame;
+			
+			newFrame.origin.y += newFrame.size.height;
+			newFrame.size.height = _splitWidth;
+			dividerRect = newFrame;
+			
+			newFrame.origin.y += newFrame.size.height;
+			newFrame.size.height = height - newFrame.origin.y;
+			detailRect = newFrame;
+			
+		} else {
+			if (!shouldShowMaster) {
+				// Move off-screen.
+				newFrame.size.height += (_splitPosition + _splitWidth);
+			}
+			
+			newFrame.size.height -= (_splitPosition + _splitWidth);
+			detailRect = newFrame;
+			
+			newFrame.origin.y += newFrame.size.height;
+			newFrame.size.height = _splitWidth;
+			dividerRect = newFrame;
+			
+			newFrame.origin.y += newFrame.size.height;
+			newFrame.size.height = _splitPosition;
+			masterRect = newFrame;
+		}
+		
+		// Position master.
+		controller = self.masterViewController;
+		if (controller && [controller isKindOfClass:[UIViewController class]])  {
+			theView = controller.view;
+			if (theView) {
+				theView.frame = masterRect;
+				if (!theView.superview) {
+					[controller viewWillAppear:NO];
+					[self.view addSubview:theView];
+					[controller viewDidAppear:NO];
+				}
+			}
+		}
+		
+		// Position divider.
+		theView = _dividerView;
+		theView.frame = dividerRect;
+		if (!theView.superview) {
+			[self.view addSubview:theView];
+		}
+		
+		// Position detail.
+		controller = self.detailViewController;
+		if (controller && [controller isKindOfClass:[UIViewController class]])  {
+			theView = controller.view;
+			if (theView) {
+				theView.frame = detailRect;
+				if (!theView.superview) {
+					[self.view insertSubview:theView aboveSubview:self.masterViewController.view];
+				} else {
+					[self.view bringSubviewToFront:theView];
+				}
+			}
+		}
+	}
+	
+	// Create corner views if necessary.
+	MGSplitCornersView *leadingCorners = nil; // top/left of screen in vertical/horizontal split.
+	MGSplitCornersView *trailingCorners = nil; // bottom/right of screen in vertical/horizontal split.
+	if (!_cornerViews) {
+		CGRect cornerRect = CGRectMake(0, 0, 10, 10); // arbitrary, will be resized below.
+		leadingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect];
+		leadingCorners.splitViewController = self;
+		leadingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR;
+		leadingCorners.cornerRadius = NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0 ? 0 : MG_DEFAULT_CORNER_RADIUS;
+		trailingCorners = [[MGSplitCornersView alloc] initWithFrame:cornerRect];
+		trailingCorners.splitViewController = self;
+		trailingCorners.cornerBackgroundColor = MG_DEFAULT_CORNER_COLOR;
+		trailingCorners.cornerRadius = NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0 ? 0 : MG_DEFAULT_CORNER_RADIUS;
+		_cornerViews = [[NSArray alloc] initWithObjects:leadingCorners, trailingCorners, nil];
+		
+	} else if ([_cornerViews count] == 2) {
+		leadingCorners = [_cornerViews objectAtIndex:0];
+		trailingCorners = [_cornerViews objectAtIndex:1];
+	}
+	
+	// Configure and layout the corner-views.
+	leadingCorners.cornersPosition = (_vertical) ? MGCornersPositionLeadingVertical : MGCornersPositionLeadingHorizontal;
+	trailingCorners.cornersPosition = (_vertical) ? MGCornersPositionTrailingVertical : MGCornersPositionTrailingHorizontal;
+	leadingCorners.autoresizingMask = (_vertical) ? UIViewAutoresizingFlexibleBottomMargin : UIViewAutoresizingFlexibleRightMargin;
+	trailingCorners.autoresizingMask = (_vertical) ? UIViewAutoresizingFlexibleTopMargin : UIViewAutoresizingFlexibleLeftMargin;
+	
+	float x, y, cornersWidth, cornersHeight;
+	CGRect leadingRect, trailingRect;
+	float radius = leadingCorners.cornerRadius;
+	if (_vertical) { // left/right split
+		cornersWidth = (radius * 2.f) + _splitWidth;
+		cornersHeight = radius;
+		x = ((shouldShowMaster) ? ((masterFirst) ? _splitPosition : width - (_splitPosition + _splitWidth)) : (0 - _splitWidth)) - radius;
+		y = 0;
+		leadingRect = CGRectMake(x, y, cornersWidth, cornersHeight); // top corners
+		trailingRect = CGRectMake(x, (height - cornersHeight), cornersWidth, cornersHeight); // bottom corners
+		
+	} else { // top/bottom split
+		x = 0;
+		y = ((shouldShowMaster) ? ((masterFirst) ? _splitPosition : height - (_splitPosition + _splitWidth)) : (0 - _splitWidth)) - radius;
+		cornersWidth = radius;
+		cornersHeight = (radius * 2.f) + _splitWidth;
+		leadingRect = CGRectMake(x, y, cornersWidth, cornersHeight); // left corners
+		trailingRect = CGRectMake((width - cornersWidth), y, cornersWidth, cornersHeight); // right corners
+	}
+	
+	leadingCorners.frame = leadingRect;
+	trailingCorners.frame = trailingRect;
+	
+	// Ensure corners are visible and frontmost.
+	if (!leadingCorners.superview) {
+		[self.view insertSubview:leadingCorners aboveSubview:self.detailViewController.view];
+		[self.view insertSubview:trailingCorners aboveSubview:self.detailViewController.view];
+	} else {
+		[self.view bringSubviewToFront:leadingCorners];
+		[self.view bringSubviewToFront:trailingCorners];
+	}
 }
 
 
 - (void)layoutSubviewsWithAnimation:(BOOL)animate
 {
-    [self layoutSubviewsForInterfaceOrientation:self.interfaceOrientation withAnimation:animate];
+	[self layoutSubviewsForInterfaceOrientation:self.interfaceOrientation withAnimation:animate];
 }
 
 
 - (void)layoutSubviews
 {
-    [self layoutSubviewsForInterfaceOrientation:self.interfaceOrientation withAnimation:YES];
+	[self layoutSubviewsForInterfaceOrientation:self.interfaceOrientation withAnimation:YES];
 }
 
 
 - (void)viewWillAppear:(BOOL)animated
 {
-    [super viewWillAppear:animated];
-
-    if ([self isShowingMaster]) {
-        [self.masterViewController viewWillAppear:animated];
-    }
-    [self.detailViewController viewWillAppear:animated];
-
-    _reconfigurePopup = YES;
-    [self layoutSubviews];
+	[super viewWillAppear:animated];
+	
+	if ([self isShowingMaster]) {
+		[self.masterViewController viewWillAppear:animated];
+	}
+	[self.detailViewController viewWillAppear:animated];
+	
+	_reconfigurePopup = YES;
 }
 
 
 - (void)viewDidAppear:(BOOL)animated
 {
-    [super viewDidAppear:animated];
-
-    if ([self isShowingMaster]) {
-        [self.masterViewController viewDidAppear:animated];
-    }
-    [self.detailViewController viewDidAppear:animated];
+	[super viewDidAppear:animated];
+	
+	if ([self isShowingMaster]) {
+		[self.masterViewController viewDidAppear:animated];
+	}
+	[self.detailViewController viewDidAppear:animated];
+	[self layoutSubviews];
 }
 
 
 - (void)viewWillDisappear:(BOOL)animated
 {
-    [super viewWillDisappear:animated];
-
-    if ([self isShowingMaster]) {
-        [self.masterViewController viewWillDisappear:animated];
-    }
-    [self.detailViewController viewWillDisappear:animated];
+	[super viewWillDisappear:animated];
+	
+	if ([self isShowingMaster]) {
+		[self.masterViewController viewWillDisappear:animated];
+	}
+	[self.detailViewController viewWillDisappear:animated];
 }
 
 
 - (void)viewDidDisappear:(BOOL)animated
 {
-    [super viewDidDisappear:animated];
-
-    if ([self isShowingMaster]) {
-        [self.masterViewController viewDidDisappear:animated];
-    }
-    [self.detailViewController viewDidDisappear:animated];
+	[super viewDidDisappear:animated];
+	
+	if ([self isShowingMaster]) {
+		[self.masterViewController viewDidDisappear:animated];
+	}
+	[self.detailViewController viewDidDisappear:animated];
 }
 
 
@@ -545,73 +536,73 @@
 
 - (void)reconfigureForMasterInPopover:(BOOL)inPopover
 {
-    _reconfigurePopup = NO;
-
-    if ((inPopover && _hiddenPopoverController) || (!inPopover && !_hiddenPopoverController) || !self.masterViewController) {
-        // Nothing to do.
-        return;
-    }
-
-    if (inPopover && !_hiddenPopoverController && !_barButtonItem) {
-        // Create and configure popover for our masterViewController.
-        [_hiddenPopoverController release];
-        _hiddenPopoverController = nil;
-        [self.masterViewController viewWillDisappear:NO];
-        _hiddenPopoverController = [[UIPopoverController alloc] initWithContentViewController:self.masterViewController];
-        [self.masterViewController viewDidDisappear:NO];
-
-        // Create and configure _barButtonItem.
-        _barButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Master", nil)
-                                                          style:UIBarButtonItemStyleBordered
-                                                         target:self
-                                                         action:@selector(showMasterPopover:)];
-
-        // Inform delegate of this state of affairs.
-        if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:)]) {
-            [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
-                                                                willHideViewController:self.masterViewController
-                                                                     withBarButtonItem:_barButtonItem
-                                                                  forPopoverController:_hiddenPopoverController];
+	_reconfigurePopup = NO;
+	
+	if ((inPopover && _hiddenPopoverController) || (!inPopover && !_hiddenPopoverController) || !self.masterViewController) {
+		// Nothing to do.
+		return;
+	}
+	
+	if (inPopover && !_hiddenPopoverController && !_barButtonItem) {
+		// Create and configure popover for our masterViewController.
+		_hiddenPopoverController = nil;
+		[self.masterViewController viewWillDisappear:NO];
+		_hiddenPopoverController = [[UIPopoverController alloc] initWithContentViewController:self.masterViewController];
+		[self.masterViewController viewDidDisappear:NO];
+		
+		// Create and configure _barButtonItem.
+		_barButtonItem = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Master", nil) 
+														  style:UIBarButtonItemStyleBordered 
+														 target:self 
+														 action:(self.togglesMasterPopover ? @selector(toggleMasterPopover:) : @selector(showMasterPopover:))];
+		
+		// Inform delegate of this state of affairs.
+		if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:)]) {
+			[(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self 
+																willHideViewController:self.masterViewController 
+																	 withBarButtonItem:_barButtonItem 
+																  forPopoverController:_hiddenPopoverController];
+		}
+		
+	} else if (!inPopover && _hiddenPopoverController && _barButtonItem) {
+		// I know this looks strange, but it fixes a bizarre issue with UIPopoverController leaving masterViewController's views in disarray.
+        // It does also break stuff on iOS8, so we disable it.
+        if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) {
+            [_hiddenPopoverController presentPopoverFromRect:CGRectZero inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
         }
 
-    } else if (!inPopover && _hiddenPopoverController && _barButtonItem) {
-        // I know this looks strange, but it fixes a bizarre issue with UIPopoverController leaving masterViewController's views in disarray.
-        [_hiddenPopoverController presentPopoverFromRect:CGRectZero inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
-
-        // Remove master from popover and destroy popover, if it exists.
-        [_hiddenPopoverController dismissPopoverAnimated:NO];
-        [_hiddenPopoverController release];
-        _hiddenPopoverController = nil;
-
-        // Inform delegate that the _barButtonItem will become invalid.
-        if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willShowViewController:invalidatingBarButtonItem:)]) {
-            [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
-                                                                willShowViewController:self.masterViewController
-                                                             invalidatingBarButtonItem:_barButtonItem];
-        }
-
-        // Destroy _barButtonItem.
-        [_barButtonItem release];
-        _barButtonItem = nil;
-
-        // Move master view.
-        UIView *masterView = self.masterViewController.view;
-        if (masterView && masterView.superview != self.view) {
-            [masterView removeFromSuperview];
-        }
-    }
+		// Remove master from popover and destroy popover, if it exists.
+		[_hiddenPopoverController dismissPopoverAnimated:NO];
+		_hiddenPopoverController = nil;
+		
+		// Inform delegate that the _barButtonItem will become invalid.
+		if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willShowViewController:invalidatingBarButtonItem:)]) {
+			[(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self 
+																willShowViewController:self.masterViewController 
+															 invalidatingBarButtonItem:_barButtonItem];
+		}
+		
+		// Destroy _barButtonItem.
+		_barButtonItem = nil;
+		
+		// Move master view.
+		UIView *masterView = self.masterViewController.view;
+		if (masterView && masterView.superview != self.view) {
+			[masterView removeFromSuperview];
+		}
+	}
 }
 
 
 - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
 {
-    [self reconfigureForMasterInPopover:NO];
+	[self reconfigureForMasterInPopover:NO];
 }
 
 
 - (void)notePopoverDismissed
 {
-    [self popoverControllerDidDismissPopover:_hiddenPopoverController];
+	[self popoverControllerDidDismissPopover:_hiddenPopoverController];
 }
 
 
@@ -621,14 +612,14 @@
 
 - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
 {
-    if (([animationID isEqualToString:MG_ANIMATION_CHANGE_SPLIT_ORIENTATION] ||
-         [animationID isEqualToString:MG_ANIMATION_CHANGE_SUBVIEWS_ORDER])
-        && _cornerViews) {
-        for (UIView *corner in _cornerViews) {
-            corner.hidden = NO;
-        }
-        _dividerView.hidden = NO;
-    }
+	if (([animationID isEqualToString:MG_ANIMATION_CHANGE_SPLIT_ORIENTATION] || 
+		 [animationID isEqualToString:MG_ANIMATION_CHANGE_SUBVIEWS_ORDER])
+		&& _cornerViews) {
+		for (UIView *corner in _cornerViews) {
+			corner.hidden = NO;
+		}
+		_dividerView.hidden = NO;
+	}
 }
 
 
@@ -638,83 +629,131 @@
 
 - (IBAction)toggleSplitOrientation:(id)sender
 {
-    BOOL showingMaster = [self isShowingMaster];
-    if (showingMaster) {
-        if (_cornerViews) {
-            for (UIView *corner in _cornerViews) {
-                corner.hidden = YES;
-            }
-            _dividerView.hidden = YES;
-        }
-        [UIView beginAnimations:MG_ANIMATION_CHANGE_SPLIT_ORIENTATION context:nil];
-        [UIView setAnimationDelegate:self];
-        [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
-    }
-    self.vertical = (!self.vertical);
-    if (showingMaster) {
-        [UIView commitAnimations];
-    }
+	BOOL showingMaster = [self isShowingMaster];
+	if (showingMaster) {
+		if (_cornerViews) {
+			for (UIView *corner in _cornerViews) {
+				corner.hidden = YES;
+			}
+			_dividerView.hidden = YES;
+		}
+		[UIView beginAnimations:MG_ANIMATION_CHANGE_SPLIT_ORIENTATION context:nil];
+		[UIView setAnimationDelegate:self];
+		[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
+	}
+	self.vertical = (!self.vertical);
+	if (showingMaster) {
+		[UIView commitAnimations];
+	}
 }
 
 
 - (IBAction)toggleMasterBeforeDetail:(id)sender
 {
-    BOOL showingMaster = [self isShowingMaster];
-    if (showingMaster) {
-        if (_cornerViews) {
-            for (UIView *corner in _cornerViews) {
-                corner.hidden = YES;
-            }
-            _dividerView.hidden = YES;
-        }
-        [UIView beginAnimations:MG_ANIMATION_CHANGE_SUBVIEWS_ORDER context:nil];
-        [UIView setAnimationDelegate:self];
-        [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
-    }
-    self.masterBeforeDetail = (!self.masterBeforeDetail);
-    if (showingMaster) {
-        [UIView commitAnimations];
-    }
+	BOOL showingMaster = [self isShowingMaster];
+	if (showingMaster) {
+		if (_cornerViews) {
+			for (UIView *corner in _cornerViews) {
+				corner.hidden = YES;
+			}
+			_dividerView.hidden = YES;
+		}
+		[UIView beginAnimations:MG_ANIMATION_CHANGE_SUBVIEWS_ORDER context:nil];
+		[UIView setAnimationDelegate:self];
+		[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
+	}
+	self.masterBeforeDetail = (!self.masterBeforeDetail);
+	if (showingMaster) {
+		[UIView commitAnimations];
+	}
 }
 
 
 - (IBAction)toggleMasterView:(id)sender
 {
-    if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
-        [_hiddenPopoverController dismissPopoverAnimated:NO];
-    }
-
-    if (![self isShowingMaster]) {
-        // We're about to show the master view. Ensure it's in place off-screen to be animated in.
-        _reconfigurePopup = YES;
-        [self reconfigureForMasterInPopover:NO];
-        [self layoutSubviews];
-    }
-
-    // This action functions on the current primary orientation; it is independent of the other primary orientation.
-    [UIView beginAnimations:@"toggleMaster" context:nil];
-    if (self.isLandscape) {
-        self.showsMasterInLandscape = !_showsMasterInLandscape;
-    } else {
-        self.showsMasterInPortrait = !_showsMasterInPortrait;
-    }
-    [UIView commitAnimations];
+	if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+		[_hiddenPopoverController dismissPopoverAnimated:NO];
+	}
+	
+	if (![self isShowingMaster]) {
+		// We're about to show the master view. Ensure it's in place off-screen to be animated in.
+		_reconfigurePopup = YES;
+		[self reconfigureForMasterInPopover:NO];
+		[self layoutSubviews];
+	}
+	
+	// This action functions on the current primary orientation; it is independent of the other primary orientation.
+	[UIView beginAnimations:@"toggleMaster" context:nil];
+	if (self.isLandscape) {
+		self.showsMasterInLandscape = !_showsMasterInLandscape;
+	} else {
+		self.showsMasterInPortrait = !_showsMasterInPortrait;
+	}
+	[UIView commitAnimations];
 }
 
 
-- (IBAction)showMasterPopover:(id) sender
+- (void) setTogglesMasterPopover:(BOOL)flag {
+
+	togglesMasterPopover = flag;
+
+	if (!_barButtonItem)
+	return;
+		
+	_barButtonItem.action = flag ? @selector(toggleMasterPopover:) : @selector(showMasterPopover:);	
+
+}
+
+- (IBAction)toggleMasterPopover:(id)sender 
 {
-    if (_hiddenPopoverController && !(_hiddenPopoverController.popoverVisible)) {
-        // Inform delegate.
-        if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:popoverController:willPresentViewController:)]) {
-            [(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self
-                                                                     popoverController:_hiddenPopoverController
-                                                             willPresentViewController:self.masterViewController];
-        }
+
+	if (!_hiddenPopoverController)
+	return;
+	
+	if (_hiddenPopoverController.popoverVisible) {
+		
+		[self hideMasterPopover:sender];
+		
+	} else {
+	
+		[self showMasterPopover:sender];
+	
+	}
+
+}
+
 
-        // Show popover.
-        [_hiddenPopoverController presentPopoverFromBarButtonItem:_barButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
-    }
+- (IBAction)showMasterPopover:(id)sender
+{
+	if (_hiddenPopoverController && !(_hiddenPopoverController.popoverVisible)) {
+		// Inform delegate.
+		if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:popoverController:willPresentViewController:)]) {
+			[(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self 
+																	 popoverController:_hiddenPopoverController 
+															 willPresentViewController:self.masterViewController];
+		}
+		
+		// Show popover.
+		[_hiddenPopoverController presentPopoverFromBarButtonItem:(sender ? sender : _barButtonItem) permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
+	}
+}
+
+
+- (IBAction)hideMasterPopover:(id)sender 
+{
+
+	if(_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+		
+		if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:popoverController:willDismissViewController:)]) {
+		
+			[(NSObject <MGSplitViewControllerDelegate> *)_delegate splitViewController:self popoverController:_hiddenPopoverController willDismissViewController:self.masterViewController];
+		
+		}
+		
+		[_hiddenPopoverController dismissPopoverAnimated:YES];
+	
+	}
+
 }
 
 
@@ -724,395 +763,393 @@
 
 - (id)delegate
 {
-    return _delegate;
+	return _delegate;
 }
 
 
 - (void)setDelegate:(id <MGSplitViewControllerDelegate>)newDelegate
 {
-    if (newDelegate != _delegate &&
-        (!newDelegate || [(NSObject *)newDelegate conformsToProtocol:@protocol(MGSplitViewControllerDelegate)])) {
-        _delegate = newDelegate;
-    }
+	if (newDelegate != _delegate && 
+		(!newDelegate || [(NSObject *)newDelegate conformsToProtocol:@protocol(MGSplitViewControllerDelegate)])) {
+		_delegate = newDelegate;
+	}
 }
 
 
 - (BOOL)showsMasterInPortrait
 {
-    return _showsMasterInPortrait;
+	return _showsMasterInPortrait;
 }
 
 
 - (void)setShowsMasterInPortrait:(BOOL)flag
 {
-    if (flag != _showsMasterInPortrait) {
-        _showsMasterInPortrait = flag;
-
-        if (![self isLandscape]) { // i.e. if this will cause a visual change.
-            if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
-                [_hiddenPopoverController dismissPopoverAnimated:NO];
-            }
-
-            // Rearrange views.
-            _reconfigurePopup = YES;
-            [self layoutSubviews];
-        }
-    }
+	if (flag != _showsMasterInPortrait) {
+		_showsMasterInPortrait = flag;
+		
+		if (![self isLandscape]) { // i.e. if this will cause a visual change.
+			if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+				[_hiddenPopoverController dismissPopoverAnimated:NO];
+			}
+			
+			// Rearrange views.
+			_reconfigurePopup = YES;
+			[self layoutSubviews];
+		}
+	}
 }
 
 
 - (BOOL)showsMasterInLandscape
 {
-    return _showsMasterInLandscape;
+	return _showsMasterInLandscape;
 }
 
 
 - (void)setShowsMasterInLandscape:(BOOL)flag
 {
-    if (flag != _showsMasterInLandscape) {
-        _showsMasterInLandscape = flag;
-
-        if ([self isLandscape]) { // i.e. if this will cause a visual change.
-            if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
-                [_hiddenPopoverController dismissPopoverAnimated:NO];
-            }
-
-            // Rearrange views.
-            _reconfigurePopup = YES;
-            [self layoutSubviews];
-        }
-    }
+	if (flag != _showsMasterInLandscape) {
+		_showsMasterInLandscape = flag;
+		
+		if ([self isLandscape]) { // i.e. if this will cause a visual change.
+			if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+				[_hiddenPopoverController dismissPopoverAnimated:NO];
+			}
+			
+			// Rearrange views.
+			_reconfigurePopup = YES;
+			[self layoutSubviews];
+		}
+	}
 }
 
 
 - (BOOL)isVertical
 {
-    return _vertical;
+	return _vertical;
 }
 
 
 - (void)setVertical:(BOOL)flag
 {
-    if (flag != _vertical) {
-        if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
-            [_hiddenPopoverController dismissPopoverAnimated:NO];
-        }
-
-        _vertical = flag;
-
-        // Inform delegate.
-        if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willChangeSplitOrientationToVertical:)]) {
-            [_delegate splitViewController:self willChangeSplitOrientationToVertical:_vertical];
-        }
-
-        [self layoutSubviews];
-    }
+	if (flag != _vertical) {
+		if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+			[_hiddenPopoverController dismissPopoverAnimated:NO];
+		}
+		
+		_vertical = flag;
+		
+		// Inform delegate.
+		if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willChangeSplitOrientationToVertical:)]) {
+			[_delegate splitViewController:self willChangeSplitOrientationToVertical:_vertical];
+		}
+		
+		[self layoutSubviews];
+	}
 }
 
 
 - (BOOL)isMasterBeforeDetail
 {
-    return _masterBeforeDetail;
+	return _masterBeforeDetail;
 }
 
 
 - (void)setMasterBeforeDetail:(BOOL)flag
 {
-    if (flag != _masterBeforeDetail) {
-        if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
-            [_hiddenPopoverController dismissPopoverAnimated:NO];
-        }
-
-        _masterBeforeDetail = flag;
-
-        if ([self isShowingMaster]) {
-            [self layoutSubviews];
-        }
-    }
+	if (flag != _masterBeforeDetail) {
+		if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+			[_hiddenPopoverController dismissPopoverAnimated:NO];
+		}
+		
+		_masterBeforeDetail = flag;
+		
+		if ([self isShowingMaster]) {
+			[self layoutSubviews];
+		}
+	}
 }
 
 
 - (float)splitPosition
 {
-    return _splitPosition;
+	return _splitPosition;
 }
 
 
 - (void)setSplitPosition:(float)posn
 {
-    // Check to see if delegate wishes to constrain the position.
-    float newPosn = posn;
-    BOOL constrained = NO;
-    CGSize fullSize = [self splitViewSizeForOrientation:self.interfaceOrientation];
-    if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:constrainSplitPosition:splitViewSize:)]) {
-        newPosn = [_delegate splitViewController:self constrainSplitPosition:newPosn splitViewSize:fullSize];
-        constrained = YES; // implicitly trust delegate's response.
-
-    } else {
-        // Apply default constraints if delegate doesn't wish to participate.
-        float minPos = MG_MIN_VIEW_WIDTH;
-        float maxPos = ((_vertical) ? fullSize.width : fullSize.height) - (MG_MIN_VIEW_WIDTH + _splitWidth);
-        constrained = (newPosn != _splitPosition && newPosn >= minPos && newPosn <= maxPos);
-    }
-
-    if (constrained) {
-        if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
-            [_hiddenPopoverController dismissPopoverAnimated:NO];
-        }
-
-        _splitPosition = newPosn;
-
-        // Inform delegate.
-        if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willMoveSplitToPosition:)]) {
-            [_delegate splitViewController:self willMoveSplitToPosition:_splitPosition];
-        }
-
-        if ([self isShowingMaster]) {
-            [self layoutSubviews];
-        }
-    }
+	// Check to see if delegate wishes to constrain the position.
+	float newPosn = posn;
+	BOOL constrained = NO;
+	CGSize fullSize = [self splitViewSizeForOrientation:self.interfaceOrientation];
+	if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:constrainSplitPosition:splitViewSize:)]) {
+		newPosn = [_delegate splitViewController:self constrainSplitPosition:newPosn splitViewSize:fullSize];
+		constrained = YES; // implicitly trust delegate's response.
+		
+	} else {
+		// Apply default constraints if delegate doesn't wish to participate.
+		float minPos = MG_MIN_VIEW_WIDTH;
+		float maxPos = (float) (((_vertical) ? fullSize.width : fullSize.height) - (MG_MIN_VIEW_WIDTH + _splitWidth));
+		constrained = (newPosn != _splitPosition && newPosn >= minPos && newPosn <= maxPos);
+	}
+	
+	if (constrained) {
+		if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+			[_hiddenPopoverController dismissPopoverAnimated:NO];
+		}
+		
+		_splitPosition = newPosn;
+		
+		// Inform delegate.
+		if (_delegate && [_delegate respondsToSelector:@selector(splitViewController:willMoveSplitToPosition:)]) {
+			[_delegate splitViewController:self willMoveSplitToPosition:_splitPosition];
+		}
+		
+		if ([self isShowingMaster]) {
+			[self layoutSubviews];
+		}
+	}
 }
 
 
 - (void)setSplitPosition:(float)posn animated:(BOOL)animate
 {
-    BOOL shouldAnimate = (animate && [self isShowingMaster]);
-    if (shouldAnimate) {
-        [UIView beginAnimations:@"SplitPosition" context:nil];
-    }
-    [self setSplitPosition:posn];
-    if (shouldAnimate) {
-        [UIView commitAnimations];
-    }
+	BOOL shouldAnimate = (animate && [self isShowingMaster]);
+	if (shouldAnimate) {
+		[UIView beginAnimations:@"SplitPosition" context:nil];
+	}
+	[self setSplitPosition:posn];
+	if (shouldAnimate) {
+		[UIView commitAnimations];
+	}
 }
 
 
 - (float)splitWidth
 {
-    return _splitWidth;
+	return _splitWidth;
 }
 
 
 - (void)setSplitWidth:(float)width
 {
-    if (width != _splitWidth && width >= 0) {
-        _splitWidth = width;
-        if ([self isShowingMaster]) {
-            [self layoutSubviews];
-        }
-    }
+	if (width != _splitWidth && width >= 0) {
+		_splitWidth = width;
+		if ([self isShowingMaster]) {
+			[self layoutSubviews];
+		}
+	}
 }
 
 
 - (NSArray *)viewControllers
 {
-    return [[_viewControllers copy] autorelease];
+	return [_viewControllers copy];
 }
 
 
 - (void)setViewControllers:(NSArray *)controllers
 {
-    if (controllers != _viewControllers) {
-        for (UIViewController *controller in _viewControllers) {
-            if ([controller isKindOfClass:[UIViewController class]]) {
-                [controller.view removeFromSuperview];
-            }
-        }
-        [_viewControllers release];
-        _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
-        if (controllers && [controllers count] >= 2) {
-            self.masterViewController = [controllers objectAtIndex:0];
-            self.detailViewController = [controllers objectAtIndex:1];
-        } else {
-            NSLog(@"Error: %@ requires 2 view-controllers. (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
-        }
-
-        [self layoutSubviews];
-    }
+	if (controllers != _viewControllers) {
+		for (UIViewController *controller in _viewControllers) {
+			if ([controller isKindOfClass:[UIViewController class]]) {
+				[controller.view removeFromSuperview];
+			}
+		}
+		_viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
+		if (controllers && [controllers count] >= 2) {
+			self.masterViewController = [controllers objectAtIndex:0];
+			self.detailViewController = [controllers objectAtIndex:1];
+		} else {
+			NSLog(@"Error: %@ requires 2 view-controllers. (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
+		}
+		
+		[self layoutSubviews];
+	}
 }
 
 
 - (UIViewController *)masterViewController
 {
-    if (_viewControllers && [_viewControllers count] > 0) {
-        NSObject *controller = [_viewControllers objectAtIndex:0];
-        if ([controller isKindOfClass:[UIViewController class]]) {
-            return [[controller retain] autorelease];
-        }
-    }
-
-    return nil;
+	if (_viewControllers && [_viewControllers count] > 0) {
+		UIViewController *controller = (UIViewController *)[_viewControllers objectAtIndex:0];
+		if ([controller isKindOfClass:[UIViewController class]]) {
+			return controller;
+		}
+	}
+	
+	return nil;
 }
 
 
 - (void)setMasterViewController:(UIViewController *)master
 {
-    if (!_viewControllers) {
-        _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
-    }
-
-    NSObject *newMaster = master;
-    if (!newMaster) {
-        newMaster = [NSNull null];
-    }
-
-    BOOL changed = YES;
-    if ([_viewControllers count] > 0) {
-        if ([_viewControllers objectAtIndex:0] == newMaster) {
-            changed = NO;
-        } else {
-            [_viewControllers replaceObjectAtIndex:0 withObject:newMaster];
-        }
-
-    } else {
-        [_viewControllers addObject:newMaster];
-    }
-
-    if (changed) {
-        [self layoutSubviews];
-    }
+	if (!_viewControllers) {
+		_viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
+	}
+	
+	NSObject *newMaster = master;
+	if (!newMaster) {
+		newMaster = [NSNull null];
+	}
+	
+	BOOL changed = YES;
+	if ([_viewControllers count] > 0) {
+		if ([_viewControllers objectAtIndex:0] == newMaster) {
+			changed = NO;
+		} else {
+			[_viewControllers replaceObjectAtIndex:0 withObject:newMaster];
+		}
+		
+	} else {
+		[_viewControllers addObject:newMaster];
+	}
+	
+	if (changed) {
+		[self layoutSubviews];
+	}
 }
 
 
 - (UIViewController *)detailViewController
 {
-    if (_viewControllers && [_viewControllers count] > 1) {
-        NSObject *controller = [_viewControllers objectAtIndex:1];
-        if ([controller isKindOfClass:[UIViewController class]]) {
-            return [[controller retain] autorelease];
-        }
-    }
-
-    return nil;
+	if (_viewControllers && [_viewControllers count] > 1) {
+		UIViewController *controller = (UIViewController *)[_viewControllers objectAtIndex:1];
+		if ([controller isKindOfClass:[UIViewController class]]) {
+			return controller;
+		}
+	}
+	
+	return nil;
 }
 
 
 - (void)setDetailViewController:(UIViewController *)detail
 {
-    if (!_viewControllers) {
-        _viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
-        [_viewControllers addObject:[NSNull null]];
-    }
-
-    BOOL changed = YES;
-    if ([_viewControllers count] > 1) {
-        if ([_viewControllers objectAtIndex:1] == detail) {
-            changed = NO;
-        } else {
-            [_viewControllers replaceObjectAtIndex:1 withObject:detail];
-        }
-
-    } else {
-        [_viewControllers addObject:detail];
-    }
-
-    if (changed) {
-        [self layoutSubviews];
-    }
+	if (!_viewControllers) {
+		_viewControllers = [[NSMutableArray alloc] initWithCapacity:2];
+		[_viewControllers addObject:[NSNull null]];
+	}
+	
+	BOOL changed = YES;
+	if ([_viewControllers count] > 1) {
+		if ([_viewControllers objectAtIndex:1] == detail) {
+			changed = NO;
+		} else {
+			[_viewControllers replaceObjectAtIndex:1 withObject:detail];
+		}
+		
+	} else {
+		[_viewControllers addObject:detail];
+	}
+	
+	if (changed) {
+		[self layoutSubviews];
+	}
 }
 
 
 - (MGSplitDividerView *)dividerView
 {
-    return [[_dividerView retain] autorelease];
+	return _dividerView;
 }
 
 
 - (void)setDividerView:(MGSplitDividerView *)divider
 {
-    if (divider != _dividerView) {
-        [_dividerView removeFromSuperview];
-        [_dividerView release];
-        _dividerView = [divider retain];
-        _dividerView.splitViewController = self;
-        _dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR;
-        if ([self isShowingMaster]) {
-            [self layoutSubviews];
-        }
-    }
+	if (divider != _dividerView) {
+		[_dividerView removeFromSuperview];
+		_dividerView = divider;
+		_dividerView.splitViewController = self;
+		_dividerView.backgroundColor = MG_DEFAULT_CORNER_COLOR;
+		if ([self isShowingMaster]) {
+			[self layoutSubviews];
+		}
+	}
 }
 
 
 - (BOOL)allowsDraggingDivider
 {
-    if (_dividerView) {
-        return _dividerView.allowsDragging;
-    }
-
-    return NO;
+	if (_dividerView) {
+		return _dividerView.allowsDragging;
+	}
+	
+	return NO;
 }
 
 
 - (void)setAllowsDraggingDivider:(BOOL)flag
 {
-    if (self.allowsDraggingDivider != flag && _dividerView) {
-        _dividerView.allowsDragging = flag;
-    }
+	if (self.allowsDraggingDivider != flag && _dividerView) {
+		_dividerView.allowsDragging = flag;
+	}
 }
 
 
 - (MGSplitViewDividerStyle)dividerStyle
 {
-    return _dividerStyle;
+	return _dividerStyle;
 }
 
 
 - (void)setDividerStyle:(MGSplitViewDividerStyle)newStyle
 {
-    if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
-        [_hiddenPopoverController dismissPopoverAnimated:NO];
-    }
-
-    // We don't check to see if newStyle equals _dividerStyle, because it's a meta-setting.
-    // Aspects could have been changed since it was set.
-    _dividerStyle = newStyle;
-
-    // Reconfigure general appearance and behaviour.
-    float cornerRadius;
-    if (_dividerStyle == MGSplitViewDividerStyleThin) {
-        cornerRadius = MG_DEFAULT_CORNER_RADIUS;
-        _splitWidth = MG_DEFAULT_SPLIT_WIDTH;
-        self.allowsDraggingDivider = NO;
-
-    } else if (_dividerStyle == MGSplitViewDividerStylePaneSplitter) {
-        cornerRadius = MG_PANESPLITTER_CORNER_RADIUS;
-        _splitWidth = MG_PANESPLITTER_SPLIT_WIDTH;
-        self.allowsDraggingDivider = YES;
-    }
-
-    // Update divider and corners.
-    [_dividerView setNeedsDisplay];
-    if (_cornerViews) {
-        for (MGSplitCornersView *corner in _cornerViews) {
-            corner.cornerRadius = cornerRadius;
-        }
-    }
-
-    // Layout all views.
-    [self layoutSubviews];
+	if (_hiddenPopoverController && _hiddenPopoverController.popoverVisible) {
+		[_hiddenPopoverController dismissPopoverAnimated:NO];
+	}
+	
+	// We don't check to see if newStyle equals _dividerStyle, because it's a meta-setting.
+	// Aspects could have been changed since it was set.
+	_dividerStyle = newStyle;
+	
+	// Reconfigure general appearance and behaviour.
+	float cornerRadius = 0.0f;
+	if (_dividerStyle == MGSplitViewDividerStyleThin) {
+		cornerRadius = NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_7_0 ? 0 : MG_DEFAULT_CORNER_RADIUS;
+		_splitWidth = MG_DEFAULT_SPLIT_WIDTH;
+		self.allowsDraggingDivider = NO;
+		
+	} else if (_dividerStyle == MGSplitViewDividerStylePaneSplitter) {
+		cornerRadius = MG_PANESPLITTER_CORNER_RADIUS;
+		_splitWidth = MG_PANESPLITTER_SPLIT_WIDTH;
+		self.allowsDraggingDivider = YES;
+	}
+	
+	// Update divider and corners.
+	[_dividerView setNeedsDisplay];
+	if (_cornerViews) {
+		for (MGSplitCornersView *corner in _cornerViews) {
+			corner.cornerRadius = cornerRadius;
+		}
+	}
+	
+	// Layout all views.
+	[self layoutSubviews];
 }
 
 
 - (void)setDividerStyle:(MGSplitViewDividerStyle)newStyle animated:(BOOL)animate
 {
-    BOOL shouldAnimate = (animate && [self isShowingMaster]);
-    if (shouldAnimate) {
-        [UIView beginAnimations:@"DividerStyle" context:nil];
-    }
-    [self setDividerStyle:newStyle];
-    if (shouldAnimate) {
-        [UIView commitAnimations];
-    }
+	BOOL shouldAnimate = (animate && [self isShowingMaster]);
+	if (shouldAnimate) {
+		[UIView beginAnimations:@"DividerStyle" context:nil];
+	}
+	[self setDividerStyle:newStyle];
+	if (shouldAnimate) {
+		[UIView commitAnimations];
+	}
 }
 
 
 - (NSArray *)cornerViews
 {
-    if (_cornerViews) {
-        return [[_cornerViews retain] autorelease];
-    }
-
-    return nil;
+	if (_cornerViews) {
+		return _cornerViews;
+	}
+	
+	return nil;
 }
 
 
@@ -1120,14 +1157,15 @@
 @synthesize showsMasterInLandscape;
 @synthesize vertical;
 @synthesize delegate;
-@synthesize viewControllers;
+@synthesize viewControllers = _viewControllers;
 @synthesize masterViewController;
 @synthesize detailViewController;
-@synthesize dividerView;
+@synthesize dividerView = _dividerView;
 @synthesize splitPosition;
 @synthesize splitWidth;
 @synthesize allowsDraggingDivider;
 @synthesize dividerStyle;
 
+@synthesize togglesMasterPopover;
 
 @end