From 309e123f122ac5b11aa2ef9daa536d19429c58d0 Mon Sep 17 00:00:00 2001 From: Rossen Hristov Date: Wed, 16 Sep 2015 16:18:52 +0300 Subject: [PATCH] Extracted view-related utility methods from "utils/utils" to "ui/utils" so that the "utils/utils" module does not depend on the view module. --- CrossPlatformModules.csproj | 6 ++- application/application.ios.ts | 4 +- ui/page/page.ios.ts | 10 ++--- ui/tab-view/tab-view.ios.ts | 6 +-- ui/utils/utils.d.ts | 12 ++++++ ui/utils/utils.ios.ts | 78 ++++++++++++++++++++++++++++++++++ utils/utils.d.ts | 8 ---- utils/utils.ios.ts | 75 -------------------------------- 8 files changed, 105 insertions(+), 94 deletions(-) create mode 100644 ui/utils/utils.d.ts create mode 100644 ui/utils/utils.ios.ts diff --git a/CrossPlatformModules.csproj b/CrossPlatformModules.csproj index 9a47ba9ed..6b6787f34 100644 --- a/CrossPlatformModules.csproj +++ b/CrossPlatformModules.csproj @@ -816,6 +816,10 @@ + + + utils.d.ts + utils.d.ts @@ -1971,7 +1975,7 @@ False - + \ No newline at end of file diff --git a/application/application.ios.ts b/application/application.ios.ts index 97c84c793..5dd1e1c2b 100644 --- a/application/application.ios.ts +++ b/application/application.ios.ts @@ -1,10 +1,10 @@ import appModule = require("application/application-common"); import frame = require("ui/frame"); -import utils = require("utils/utils"); import types = require("utils/types"); import view = require("ui/core/view"); import definition = require("application"); import enums = require("ui/enums"); +import uiUtils = require("ui/utils"); global.moduleMerge(appModule, exports); @@ -32,7 +32,7 @@ class Window extends UIWindow { } public layoutSubviews(): void { - utils.ios._layoutRootView(this._content, UIScreen.mainScreen().bounds); + uiUtils.ios._layoutRootView(this._content, UIScreen.mainScreen().bounds); } } diff --git a/ui/page/page.ios.ts b/ui/page/page.ios.ts index 74a541e81..8cc170a0d 100644 --- a/ui/page/page.ios.ts +++ b/ui/page/page.ios.ts @@ -2,7 +2,7 @@ import definition = require("ui/page"); import viewModule = require("ui/core/view"); import trace = require("trace"); -import utils = require("utils/utils"); +import uiUtils = require("ui/utils"); global.moduleMerge(pageCommon, exports); @@ -23,7 +23,7 @@ class UIViewControllerImpl extends UIViewController { trace.write(this._owner + " didRotateFromInterfaceOrientation(" + fromInterfaceOrientation + ")", trace.categories.ViewHierarchy); if (this._owner._isModal) { var parentBounds = (this._owner)._UIModalPresentationFormSheet ? (this._owner._nativeView).superview.bounds : UIScreen.mainScreen().bounds; - utils.ios._layoutRootView(this._owner, parentBounds); + uiUtils.ios._layoutRootView(this._owner, parentBounds); } } @@ -37,7 +37,7 @@ class UIViewControllerImpl extends UIViewController { trace.write(this._owner + " viewDidLayoutSubviews, isLoaded = " + this._owner.isLoaded, trace.categories.ViewHierarchy); if (this._owner._isModal) { var parentBounds = (this._owner)._UIModalPresentationFormSheet ? this._owner._nativeView.superview.bounds : UIScreen.mainScreen().bounds; - utils.ios._layoutRootView(this._owner, parentBounds); + uiUtils.ios._layoutRootView(this._owner, parentBounds); } else { this._owner._updateLayout(); @@ -137,7 +137,7 @@ export class Page extends pageCommon.Page { if (fullscreen) { this._ios.modalPresentationStyle = UIModalPresentationStyle.UIModalPresentationFullScreen; - utils.ios._layoutRootView(this, UIScreen.mainScreen().bounds); + uiUtils.ios._layoutRootView(this, UIScreen.mainScreen().bounds); } else { this._ios.modalPresentationStyle = UIModalPresentationStyle.UIModalPresentationFormSheet; @@ -148,7 +148,7 @@ export class Page extends pageCommon.Page { parent.ios.presentViewControllerAnimatedCompletion(this._ios, false, function completion() { if (!fullscreen) { // We can measure and layout the modal page after we know its parent's dimensions. - utils.ios._layoutRootView(that, that._nativeView.superview.bounds); + uiUtils.ios._layoutRootView(that, that._nativeView.superview.bounds); } that._raiseShownModallyEvent(parent, context, closeCallback); diff --git a/ui/tab-view/tab-view.ios.ts b/ui/tab-view/tab-view.ios.ts index 9df7bfcbd..68ea83848 100644 --- a/ui/tab-view/tab-view.ios.ts +++ b/ui/tab-view/tab-view.ios.ts @@ -1,9 +1,9 @@ import common = require("ui/tab-view/tab-view-common"); import definition = require("ui/tab-view"); import dependencyObservable = require("ui/core/dependency-observable"); -import utilsModule = require("utils/utils"); import trace = require("trace"); import utils = require("utils/utils"); +import uiUtils = require("ui/utils"); import view = require("ui/core/view"); import imageSource = require("image-source"); import types = require("utils/types"); @@ -244,8 +244,8 @@ export class TabView extends common.TabView { var height = utils.layout.getMeasureSpecSize(heightMeasureSpec); var heightMode = utils.layout.getMeasureSpecMode(heightMeasureSpec); - this._tabBarHeight = utilsModule.ios.getActualHeight(this._ios.tabBar); - this._navBarHeight = utilsModule.ios.getActualHeight(this._ios.moreNavigationController.navigationBar); + this._tabBarHeight = uiUtils.ios.getActualHeight(this._ios.tabBar); + this._navBarHeight = uiUtils.ios.getActualHeight(this._ios.moreNavigationController.navigationBar); var density = utils.layout.getDisplayDensity(); var measureWidth = 0; diff --git a/ui/utils/utils.d.ts b/ui/utils/utils.d.ts new file mode 100644 index 000000000..5b063eddb --- /dev/null +++ b/ui/utils/utils.d.ts @@ -0,0 +1,12 @@ +declare module "ui/utils" { + import view = require("ui/core/view"); + module ios { + /** + * Gets actual height of a [UIView](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/) widget. + * @param uiView - An instance of UIView. + */ + export function getActualHeight(uiView: UIView): number; + + export function _layoutRootView(rootView: view.View, parentBounds: CGRect): void; + } +} diff --git a/ui/utils/utils.ios.ts b/ui/utils/utils.ios.ts new file mode 100644 index 000000000..c0ec9dea0 --- /dev/null +++ b/ui/utils/utils.ios.ts @@ -0,0 +1,78 @@ +import view = require("ui/core/view"); +import utils = require("utils/utils"); + +export module ios { + export function getActualHeight(uiView: UIView): number { + if (uiView.window && !uiView.hidden) { + return uiView.frame.size.height; + } + + return 0; + } + + export function _layoutRootView(rootView: view.View, parentBounds: CGRect) { + if (!rootView || !parentBounds) { + return; + } + + var landscape = utils.ios.isLandscape(); + var iOSMajorVersion = utils.ios.MajorVersion; + var size = parentBounds.size; + var width = size.width; + var height = size.height; + + //trace.write("--------------------------------------------", "LayoutRootView.iOS"); + //trace.write("| Layout Root View", "LayoutRootView.iOS"); + //trace.write("| rootView: " + rootView, "LayoutRootView.iOS"); + //trace.write("| parentBounds: " + NSStringFromCGRect(parentBounds), "LayoutRootView.iOS"); + //trace.write("| UIScreen.mainScreen().bounds: " + NSStringFromCGRect(UIScreen.mainScreen().bounds), "LayoutRootView.iOS"); + //trace.write("| _isModal: " + (rootView)._isModal, "LayoutRootView.iOS"); + //trace.write("| _UIModalPresentationFormSheet: " + (rootView)._UIModalPresentationFormSheet, "LayoutRootView.iOS"); + //trace.write("| landscape: " + landscape, "LayoutRootView.iOS"); + //trace.write("| iOSMajorVersion: " + iOSMajorVersion, "LayoutRootView.iOS"); + var superview = (rootView._nativeView).superview; + //trace.write("| superview: " + superview, "LayoutRootView.iOS"); + var superViewRotationRadians; + if (superview) { + superViewRotationRadians = atan2f(superview.transform.b, superview.transform.a); + //trace.write("| superViewRotationRadians: " + superViewRotationRadians + " rad.", "LayoutRootView.iOS"); + //trace.write("| superview.bounds: " + NSStringFromCGRect(superview.bounds), "LayoutRootView.iOS"); + } + + if (iOSMajorVersion < 8 && landscape && !superViewRotationRadians) { + // in iOS 7 when in landscape we switch width with height because on device they don't change even when rotated. + //trace.write("| >>> Detected iOS 7 device in landscape mode and superview is not rotated. Manually swapping width and height...", "LayoutRootView.iOS"); + width = size.height; + height = size.width; + } + + var statusBarHeight; + if (UIApplication.sharedApplication().statusBarHidden || ((rootView)._UIModalPresentationFormSheet && !CGSizeEqualToSize(parentBounds.size, UIScreen.mainScreen().bounds.size))) { + statusBarHeight = 0; + } + else { + // Status bar section + var statusFrame = UIApplication.sharedApplication().statusBarFrame; + try { + statusBarHeight = Math.min(statusFrame.size.width, statusFrame.size.height); + } catch (ex) { + console.log("exception: " + ex); + } + } + //trace.write("| UIApplication.sharedApplication().statusBarHidden: " + UIApplication.sharedApplication().statusBarHidden, "LayoutRootView.iOS"); + //trace.write("| statusBarHeight: " + statusBarHeight, "LayoutRootView.iOS"); + + var origin = parentBounds.origin; + var left = origin.x; + var top = origin.y + statusBarHeight; + + var widthSpec = utils.layout.makeMeasureSpec(width, utils.layout.EXACTLY); + var heightSpec = utils.layout.makeMeasureSpec(height - statusBarHeight, utils.layout.EXACTLY); + + //trace.write("| >>> Will measure and layout with {{" + left + ", " + top + "}{" + width + ", " + height + "}}", "LayoutRootView.iOS"); + //trace.write("--------------------------------------------", "LayoutRootView.iOS"); + + rootView.measure(widthSpec, heightSpec); + rootView.layout(left, top, width, height); + } +} \ No newline at end of file diff --git a/utils/utils.d.ts b/utils/utils.d.ts index b044b2b20..c54596630 100644 --- a/utils/utils.d.ts +++ b/utils/utils.d.ts @@ -1,6 +1,5 @@ declare module "utils/utils" { import colorModule = require("color"); - import view = require("ui/core/view"); export var RESOURCE_PREFIX: string; @@ -129,11 +128,6 @@ * @param uiColor - UIColor instance used to create a NativeScript color. */ export function getColor(uiColor: UIColor): colorModule.Color; - /** - * Gets actual height of a [UIView](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/) widget. - * @param uiView - An instance of UIView. - */ - export function getActualHeight(uiView: UIView): number; /** * Gets an information about if current mode is Landscape. */ @@ -142,8 +136,6 @@ * Gets the iOS device major version (for 8.1 will return 8). */ export var MajorVersion: number; - - export function _layoutRootView(rootView: view.View, parentBounds: CGRect): void; } /** * An utility function that copies properties from source object to target object. diff --git a/utils/utils.ios.ts b/utils/utils.ios.ts index b96b9de01..0a477c981 100644 --- a/utils/utils.ios.ts +++ b/utils/utils.ios.ts @@ -1,6 +1,5 @@ import common = require("utils/utils-common"); import colorModule = require("color"); -import view = require("ui/core/view"); global.moduleMerge(common, exports); @@ -60,14 +59,6 @@ export module ios { return new colorModule.Color(alpha, red, green, blue); } - export function getActualHeight(uiView: UIView): number { - if (uiView.window && !uiView.hidden) { - return uiView.frame.size.height; - } - - return 0; - } - export function isLandscape(): boolean { var device = UIDevice.currentDevice(); var statusBarOrientation = UIApplication.sharedApplication().statusBarOrientation; @@ -76,72 +67,6 @@ export module ios { } export var MajorVersion = NSString.stringWithString(UIDevice.currentDevice().systemVersion).intValue; - - export function _layoutRootView(rootView: view.View, parentBounds: CGRect) { - if (!rootView || !parentBounds) { - return; - } - - var landscape = isLandscape(); - var iOSMajorVersion = MajorVersion; - var size = parentBounds.size; - var width = size.width; - var height = size.height; - - //trace.write("--------------------------------------------", "LayoutRootView.iOS"); - //trace.write("| Layout Root View", "LayoutRootView.iOS"); - //trace.write("| rootView: " + rootView, "LayoutRootView.iOS"); - //trace.write("| parentBounds: " + NSStringFromCGRect(parentBounds), "LayoutRootView.iOS"); - //trace.write("| UIScreen.mainScreen().bounds: " + NSStringFromCGRect(UIScreen.mainScreen().bounds), "LayoutRootView.iOS"); - //trace.write("| _isModal: " + (rootView)._isModal, "LayoutRootView.iOS"); - //trace.write("| _UIModalPresentationFormSheet: " + (rootView)._UIModalPresentationFormSheet, "LayoutRootView.iOS"); - //trace.write("| landscape: " + landscape, "LayoutRootView.iOS"); - //trace.write("| iOSMajorVersion: " + iOSMajorVersion, "LayoutRootView.iOS"); - var superview = (rootView._nativeView).superview; - //trace.write("| superview: " + superview, "LayoutRootView.iOS"); - var superViewRotationRadians; - if (superview) { - superViewRotationRadians = atan2f(superview.transform.b, superview.transform.a); - //trace.write("| superViewRotationRadians: " + superViewRotationRadians + " rad.", "LayoutRootView.iOS"); - //trace.write("| superview.bounds: " + NSStringFromCGRect(superview.bounds), "LayoutRootView.iOS"); - } - - if (iOSMajorVersion < 8 && landscape && !superViewRotationRadians) { - // in iOS 7 when in landscape we switch width with height because on device they don't change even when rotated. - //trace.write("| >>> Detected iOS 7 device in landscape mode and superview is not rotated. Manually swapping width and height...", "LayoutRootView.iOS"); - width = size.height; - height = size.width; - } - - var statusBarHeight; - if (UIApplication.sharedApplication().statusBarHidden || ((rootView)._UIModalPresentationFormSheet && !CGSizeEqualToSize(parentBounds.size, UIScreen.mainScreen().bounds.size))) { - statusBarHeight = 0; - } - else { - // Status bar section - var statusFrame = UIApplication.sharedApplication().statusBarFrame; - try { - statusBarHeight = Math.min(statusFrame.size.width, statusFrame.size.height); - } catch (ex) { - console.log("exception: " + ex); - } - } - //trace.write("| UIApplication.sharedApplication().statusBarHidden: " + UIApplication.sharedApplication().statusBarHidden, "LayoutRootView.iOS"); - //trace.write("| statusBarHeight: " + statusBarHeight, "LayoutRootView.iOS"); - - var origin = parentBounds.origin; - var left = origin.x; - var top = origin.y + statusBarHeight; - - var widthSpec = layout.makeMeasureSpec(width, common.layout.EXACTLY); - var heightSpec = layout.makeMeasureSpec(height - statusBarHeight, common.layout.EXACTLY); - - //trace.write("| >>> Will measure and layout with {{" + left + ", " + top + "}{" + width + ", " + height + "}}", "LayoutRootView.iOS"); - //trace.write("--------------------------------------------", "LayoutRootView.iOS"); - - rootView.measure(widthSpec, heightSpec); - rootView.layout(left, top, width, height); - } } export function GC() {