如何在NativeScript布局中查找/观察视图的尺寸?

时间:2016-02-17 18:01:56

标签: nativescript

当我的布局加载其中的任何视图时,其宽度和高度都为NaN,它还有getMeasuredHeight()getMeasuredWidth() 0

在某些时候getMeasuredHeight()getMeasuredWidth()(布局布局后我猜)会收到有用的值。

我如何获得任何尺寸?我该怎么看他们改变? .width.height何时不会NaN ???为什么我不能将视图悬停在整个屏幕上????

到目前为止,我每100毫秒一直投票,我觉得很愚蠢。请帮忙。

7 个答案:

答案 0 :(得分:9)

使用正确的导入:

import platform = require("platform")

或者如果您使用

import {screen} from "platform"
//or import {screen} from "tns-core-modules/platform/platform"

然后您可以根据您的语言使用它:

打字稿:

screen.mainScreen.heightDIPs //for example : 640
screen.mainScreen.widthDIPs
screen.mainScreen.heightDIPs
screen.mainScreen.heightPixels

mainScreen实现ScreenMetrics界面,允许访问不同的屏幕尺寸。

JS:

platform.screen.mainScreen.heightDIPs //for example : 640
platform.screen.mainScreen.widthDIPs
platform.screen.mainScreen.heightDIPs
platform.screen.mainScreen.heightPixels

注意:此属性是移动设备屏幕的尺寸。

答案 1 :(得分:5)

您可以在view.getActualSize().width/height事件上尝试navigatedTo。 只有在此活动中,您才能获得height/width

的实际layout/view

您可以参考here

答案 2 :(得分:3)

当NS为视图触发加载事件时,此时尚未呈现它。这就是为什么你里面的所有视图都有0高度和宽度。您可以通过等待某个时间来解决方法,而不是尝试获取视图维度。将此添加到已加载的函数:

var height = 0

function checkIfViewRendered() {
    setTimeout(function() {
        height = view.getMeasuredHeight()
    }, 100)
    if (height === 0) checkIfViewRendered()
    else console.log('rendered height is', height)
}

checkIfViewRendered()

希望这有帮助。

答案 3 :(得分:2)

  

我怎样才能看到他们改变?

您也可以在设备旋转时配置一些变量:

Angular2

中的

import { Component, OnInit, OnDestroy, NgZone } from "@angular/core";
import * as application from "application";

@Component({
    ...
})
export class MyComponent implements OnInit, OnDestroy {

    ngOnInit() {
        this.setIsScreenWide();
        application.on(application.orientationChangedEvent, this.onOrientationChanged, this);
    }

    isScreenWide: boolean;

    setIsScreenWide() {
        let widthDIPs = screen.mainScreen.widthDIPs;
        this.isScreenWide = widthDIPs >= 480;
    }

    onOrientationChanged = (args: application.OrientationChangedEventData) => {
        this.zone.run(() => {
            setTimeout(() => {
                this.setIsScreenWide();
            }, 17 /* one frame @ 60 frames/s, no flicker */);
        });
    };

    ngOnDestroy() {
        application.off(application.orientationChangedEvent, this.onOrientationChanged, this);
    }

    ...
}

答案 4 :(得分:2)

可以监视order_by的{​​{1}}事件。每次完成布局过程都将触发该事件。查看调整大小

games = Game.query.filter(Game.players.contains(p)).order_by(Game.some_field).all()

答案 5 :(得分:1)

您可以订阅页面的navigatedTo事件,这似乎发生在视图布局之后。 getMeasuredHeight()getMeasuredWidth()方法应该返回一个值。

在xml文件中添加:

<Page xmlns="http://schemas.nativescript.org/tns.xsd" loaded="pageLoaded" navigatedTo="{{ navigated }}">
<DockLayout id="mainLayout">
...
</DockLayout>

在ts文件中添加匹配方法:

public navigated(args:EventData){
        alert ("My view height is " + this.myView.getMeasuredHeight());
    }

并在pageLoaded事件链接myView中查看您的视图:

public pageLoaded(args: EventData) {
    this.page = <Page>args.object;
    this.page.bindingContext = this;
    this.myView = <DockLayout>this.page.getViewById("mainLayout");        
}

希望这有帮助。

斯特凡诺

答案 6 :(得分:1)

您可以使用layoutChangedEvent来响应正在调整大小的视图。如果您的视图称为view,则应采用以下方法:

import { View } from "ui/core/view";
import { EventData } from 'data/observable';

// ...

view.on(View.layoutChangedEvent, (e:EventData) => {
  const size = view.getActualSize();
  // ... do something with the size
});