Skip to content

ios: layout changes in deviceOrientationChanged are not always correctly updated on display #130

Open
@cjohn001

Description

@cjohn001

Environment

OS: macOS 14.4.1
CPU: (10) arm64 Apple M1 Pro
Shell: /bin/zsh
node: 20.11.1
npm: 10.2.4
nativescript: 8.6.5

# android
java: 11.0.22
ndk: Not Found
apis: Not Found
build_tools: Not Found
system_images: Not Found

# ios
xcode: 15.3/15E204a
cocoapods: 1.15.2
python: 3.12.2
python3: 3.12.2
ruby: 2.7.8
platforms: 
  - DriverKit 23.4
  - iOS 17.4
  - macOS 14.4
  - tvOS 17.4
  - visionOS 1.1
  - watchOS 10.4

Dependencies

"dependencies": {
  "@angular/animations": "17.3.3",
  "@angular/common": "17.3.3",
  "@angular/compiler": "17.3.3",
  "@angular/core": "17.3.3",
  "@angular/forms": "17.3.3",
  "@angular/platform-browser": "17.3.3",
  "@angular/platform-browser-dynamic": "17.3.3",
  "@angular/router": "17.3.3",
  "@apollo/client": "3.9.10",
  "@mnd/external-web-view": "file:../app-plugins/dist/packages/external-web-view/mnd-external-web-view-1.0.1.tgz",
  "@nativescript/angular": "17.0.0",
  "@nativescript/core": "8.6.2",
  "@nativescript/iqkeyboardmanager": "2.1.1",
  "@nativescript/localize": "5.2.0",
  "@nativescript/mlkit-barcode-scanning": "2.1.0",
  "@nativescript/mlkit-core": "2.1.0",
  "@nativescript/secure-storage": "3.0.3",
  "@nativescript/theme": "3.0.2",
  "@nativescript/ui-charts": "0.2.4",
  "apollo-angular": "6.0.0",
  "apollo3-cache-persist": "0.15.0",
  "d3-ease": "3.0.1",
  "graphql": "16.8.1",
  "graphql-tag": "2.12.6",
  "intl": "1.2.5",
  "moment": "2.30.1",
  "nativescript-health-data": "file:../app-plugins-customized/nativescript-health-data/publish/package/nativescript-health-data-2.0.0.tgz",
  "nativescript-oauth2-ext": "file:../app-plugins-customized/nativescript-oauth2-ext/publish/package/nativescript-oauth2-ext-3.0.3.tgz",
  "nativescript-sqlite": "2.8.6",
  "nativescript-sqlite-commercial": "file:../app-plugins-customized/commercial-sqlite/nativescript-sqlite-commercial-1.8.0.tgz",
  "nativescript-sqlite-encrypted": "file:../app-plugins-customized/commercial-sqlite/nativescript-sqlite-encrypted-1.6.0.tgz",
  "nativescript-ui-calendar": "15.2.3",
  "nativescript-ui-gauge": "15.2.3",
  "qs": "npm:[email protected]",
  "rxjs": "7.8.1",
  "util": "0.12.5",
  "uuidjs": "5.0.1",
  "zone.js": "0.14.4"
},
"devDependencies": {
  "@angular-devkit/build-angular": "17.3.3",
  "@angular/compiler-cli": "17.3.3",
  "@graphql-codegen/cli": "5.0.2",
  "@graphql-codegen/fragment-matcher": "5.0.2",
  "@graphql-codegen/introspection": "4.0.3",
  "@graphql-codegen/typescript": "4.0.6",
  "@graphql-codegen/typescript-apollo-angular": "4.0.0",
  "@graphql-codegen/typescript-operations": "4.2.0",
  "@nativescript/android": "8.6.2",
  "@nativescript/ios": "8.6.4",
  "@nativescript/types": "8.6.1",
  "@nativescript/webpack": "5.0.18",
  "@ngtools/webpack": "17.3.3",
  "@types/d3-ease": "3.0.2",
  "@types/intl": "1.2.2",
  "@types/lodash": "4.17.0",
  "@types/node": "20.12.5",
  "keycloak-request-token": "0.1.0",
  "rimraf": "5.0.5",
  "sass": "1.74.1",
  "ts-node": "10.9.2",
  "typescript": "5.2.2"
}

Describe the bug
When I do a layout change in the orientationChangedEvent method these changes are not correctly applied to the user interface, if I do not explictely call ChangeDetectorRef.detectChanges().

To Reproduce

        private readonly cdr = inject(ChangeDetectorRef);
        public _rows = signal<string>(
		this._isSmallTablet
			? '*,60,60,60,60,60,60,60,60,60,60,60,60,60,*'
			: '25,60,60,60,60,60,60,60,60,60,60,60,60,60,*'
	);
	
        ngOnInit(){
	Application.on(Application.orientationChangedEvent, this.deviceOrientationChanged, this);
	}
	//////////////////////////////////////////////////////////////////////////////////////////////////
	private updateLayoutMode(mode: 'portrait' | 'landscape' | 'unknown') {
		let rows: string;
		if (mode !== 'landscape') {
			this._showActionButtonsWithText = true;
			rows = '25,60,60,60,60,60,60,60,60,60,60,60,60,60,*';
			if (this._isSmallTablet) {
				rows = '*,60,60,60,60,60,60,60,60,60,60,60,60,60,*';
			}
		} else {
			this._showActionButtonsWithText = false;
			rows = '*,60,60,60,60,60,60,60,60,*,60';
		}
		this._rows.set(rows);
	}
	//////////////////////////////////////////////////////////////////////////////////////////////////
	public deviceOrientationChanged(evt: OrientationChangedEventData) {
		if (Math.min(Screen.mainScreen.widthDIPs, Screen.mainScreen.heightDIPs) < 1000) {
			this.updateLayoutMode(evt.newValue);
			this.cdr.detectChanges();
		}
	}

Expected behavior
I would expect that I do not need this.cdr.detectChanges(); in the deviceOrientationChanged method in order for layout changes to be picked up by renderer.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions