Skip to content

Commit f8b13ac

Browse files
author
Hristo Hristov
authored
Label textWrap fix for iOS (NativeScript#3842)
1 parent 9b47fff commit f8b13ac

File tree

6 files changed

+33
-34
lines changed

6 files changed

+33
-34
lines changed

tns-core-modules/ui/border/border.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,21 @@ export class Border extends ContentView implements BorderDefinition {
1414
}
1515

1616
public onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
17-
let width = layout.getMeasureSpecSize(widthMeasureSpec);
18-
let widthMode = layout.getMeasureSpecMode(widthMeasureSpec);
17+
const width = layout.getMeasureSpecSize(widthMeasureSpec);
18+
const widthMode = layout.getMeasureSpecMode(widthMeasureSpec);
1919

20-
let height = layout.getMeasureSpecSize(heightMeasureSpec);
21-
let heightMode = layout.getMeasureSpecMode(heightMeasureSpec);
20+
const height = layout.getMeasureSpecSize(heightMeasureSpec);
21+
const heightMode = layout.getMeasureSpecMode(heightMeasureSpec);
2222

23-
let horizontalBorderLength = this.effectiveBorderLeftWidth + this.effectiveBorderRightWidth;
24-
let verticalBorderLength = this.effectiveBorderTopWidth + this.effectiveBorderBottomWidth;
23+
const horizontalBorderLength = this.effectiveBorderLeftWidth + this.effectiveBorderRightWidth;
24+
const verticalBorderLength = this.effectiveBorderTopWidth + this.effectiveBorderBottomWidth;
2525

26-
let result = View.measureChild(this, this.layoutView,
26+
const result = View.measureChild(this, this.layoutView,
2727
layout.makeMeasureSpec(width - horizontalBorderLength, widthMode),
2828
layout.makeMeasureSpec(height - verticalBorderLength, heightMode));
2929

30-
let widthAndState = View.resolveSizeAndState(result.measuredWidth + horizontalBorderLength, width, widthMode, 0);
31-
let heightAndState = View.resolveSizeAndState(result.measuredHeight + verticalBorderLength, height, heightMode, 0);
30+
const widthAndState = View.resolveSizeAndState(result.measuredWidth + horizontalBorderLength, width, widthMode, 0);
31+
const heightAndState = View.resolveSizeAndState(result.measuredHeight + verticalBorderLength, height, heightMode, 0);
3232

3333
this.setMeasuredDimension(widthAndState, heightAndState);
3434
}

tns-core-modules/ui/content-view/content-view.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,19 +69,19 @@ export class ContentView extends CustomLayoutView implements ContentViewDefiniti
6969

7070
// This method won't be called in Android because we use the native android layout.
7171
public onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
72-
let result = View.measureChild(this, this.layoutView, widthMeasureSpec, heightMeasureSpec);
72+
const result = View.measureChild(this, this.layoutView, widthMeasureSpec, heightMeasureSpec);
7373

74-
let width = layout.getMeasureSpecSize(widthMeasureSpec);
75-
let widthMode = layout.getMeasureSpecMode(widthMeasureSpec);
74+
const width = layout.getMeasureSpecSize(widthMeasureSpec);
75+
const widthMode = layout.getMeasureSpecMode(widthMeasureSpec);
7676

77-
let height = layout.getMeasureSpecSize(heightMeasureSpec);
78-
let heightMode = layout.getMeasureSpecMode(heightMeasureSpec);
77+
const height = layout.getMeasureSpecSize(heightMeasureSpec);
78+
const heightMode = layout.getMeasureSpecMode(heightMeasureSpec);
7979

80-
let measureWidth = Math.max(result.measuredWidth, this.effectiveMinWidth);
81-
let measureHeight = Math.max(result.measuredHeight, this.effectiveMinHeight);
80+
const measureWidth = Math.max(result.measuredWidth, this.effectiveMinWidth);
81+
const measureHeight = Math.max(result.measuredHeight, this.effectiveMinHeight);
8282

83-
let widthAndState = View.resolveSizeAndState(measureWidth, width, widthMode, 0);
84-
let heightAndState = View.resolveSizeAndState(measureHeight, height, heightMode, 0);
83+
const widthAndState = View.resolveSizeAndState(measureWidth, width, widthMode, 0);
84+
const heightAndState = View.resolveSizeAndState(measureHeight, height, heightMode, 0);
8585

8686
this.setMeasuredDimension(widthAndState, heightAndState);
8787
}

tns-core-modules/ui/core/view/view-common.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -459,21 +459,21 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
459459
let result = size;
460460
switch (specMode) {
461461
case layout.UNSPECIFIED:
462-
result = size;
462+
result = Math.ceil(size);
463463
break;
464464

465465
case layout.AT_MOST:
466466
if (specSize < size) {
467-
result = Math.round(specSize + 0.499) | layout.MEASURED_STATE_TOO_SMALL;
467+
result = Math.ceil(specSize) | layout.MEASURED_STATE_TOO_SMALL;
468468
}
469469
break;
470470

471471
case layout.EXACTLY:
472-
result = specSize;
472+
result = Math.ceil(specSize);
473473
break;
474474
}
475475

476-
return Math.round(result + 0.499) | (childMeasuredState & layout.MEASURED_STATE_MASK);
476+
return result | (childMeasuredState & layout.MEASURED_STATE_MASK);
477477
}
478478

479479
public static combineMeasuredStates(curState: number, newState): number {

tns-core-modules/ui/html-view/html-view.ios.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export class HtmlView extends HtmlViewBase {
2929
public onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
3030
var nativeView = this._nativeView;
3131
if (nativeView) {
32-
3332
const width = layout.getMeasureSpecSize(widthMeasureSpec);
3433
const widthMode = layout.getMeasureSpecMode(widthMeasureSpec);
3534

@@ -38,7 +37,7 @@ export class HtmlView extends HtmlViewBase {
3837

3938
const desiredSize = layout.measureNativeView(nativeView, width, widthMode, height, heightMode);
4039

41-
const labelWidth = Math.min(desiredSize.width, width);
40+
const labelWidth = widthMode === layout.AT_MOST ? Math.min(desiredSize.width, width) : desiredSize.width;
4241
const measureWidth = Math.max(labelWidth, this.effectiveMinWidth);
4342
const measureHeight = Math.max(desiredSize.height, this.effectiveMinHeight);
4443

tns-core-modules/ui/label/label.ios.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -67,27 +67,27 @@ export class Label extends TextBase implements LabelDefinition {
6767
public onMeasure(widthMeasureSpec: number, heightMeasureSpec: number): void {
6868
let nativeView = this.nativeView;
6969
if (nativeView) {
70-
let width = layout.getMeasureSpecSize(widthMeasureSpec);
71-
let widthMode = layout.getMeasureSpecMode(widthMeasureSpec);
70+
const width = layout.getMeasureSpecSize(widthMeasureSpec);
71+
const widthMode = layout.getMeasureSpecMode(widthMeasureSpec);
7272

73-
let height = layout.getMeasureSpecSize(heightMeasureSpec);
74-
let heightMode = layout.getMeasureSpecMode(heightMeasureSpec);
73+
const height = layout.getMeasureSpecSize(heightMeasureSpec);
74+
const heightMode = layout.getMeasureSpecMode(heightMeasureSpec);
7575

7676
this._fixedSize = (widthMode === layout.EXACTLY ? FixedSize.WIDTH : FixedSize.NONE)
7777
| (heightMode === layout.EXACTLY ? FixedSize.HEIGHT : FixedSize.NONE);
7878

7979
const nativeSize = layout.measureNativeView(nativeView, width, widthMode, height, heightMode);
8080
let labelWidth = nativeSize.width;
8181

82-
if (this.textWrap) {
82+
if (this.textWrap && widthMode === layout.AT_MOST) {
8383
labelWidth = Math.min(labelWidth, width);
8484
}
8585

86-
let measureWidth = Math.max(labelWidth, this.effectiveMinWidth);
87-
let measureHeight = Math.max(nativeSize.height, this.effectiveMinHeight);
86+
const measureWidth = Math.max(labelWidth, this.effectiveMinWidth);
87+
const measureHeight = Math.max(nativeSize.height, this.effectiveMinHeight);
8888

89-
let widthAndState = View.resolveSizeAndState(measureWidth, width, widthMode, 0);
90-
let heightAndState = View.resolveSizeAndState(measureHeight, height, heightMode, 0);
89+
const widthAndState = View.resolveSizeAndState(measureWidth, width, widthMode, 0);
90+
const heightAndState = View.resolveSizeAndState(measureHeight, height, heightMode, 0);
9191

9292
this.setMeasuredDimension(widthAndState, heightAndState);
9393
}

tns-core-modules/utils/utils.ios.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ export module layout {
1616
var MODE_MASK = 0x3 << MODE_SHIFT;
1717

1818
export function makeMeasureSpec(size: number, mode: number): number {
19-
return (Math.round(size) & ~MODE_MASK) | (mode & MODE_MASK);
19+
return (Math.round(Math.max(0, size)) & ~MODE_MASK) | (mode & MODE_MASK);
2020
}
2121

2222
export function getDisplayDensity(): number {

0 commit comments

Comments
 (0)