Fix iOS 26 Stepper overlap in landscape - #35374
Conversation
Updated [Magick.NET-Q8-AnyCPU](https://github.com/dlemstra/Magick.NET) from 14.10.4 to 14.12.0. <details> <summary>Release notes</summary> _Sourced from [Magick.NET-Q8-AnyCPU's releases](https://github.com/dlemstra/Magick.NET/releases)._ ## 14.12.0 ### What's Changed - Added `FixByteOrder` to the `DcmReadDefines` (#1976) - Added `IconWriteDefines`. ### Related changes in ImageMagick since the last release of Magick.NET: - Correct bug in `Composite` when using `CopyAlpha` (#1985) - Fixed incorrect orientation of JPEG compressed TIFF images (#1991) - Heap-Buffer-Overflow write of single zero byte when parsing xml (GHSA-cr67-pvmx-2pp2) - Stack Overflow in DestroyXMLTree (GHSA-fwvm-ggf6-2p4x) - Out-of-Bounds read in sample operation (GHSA-pcvx-ph33-r5vv) - Stack Overflow via Recursive FX Expression Parsing (GHSA-f4qm-vj5j-9xpw) - Heap Buffer Overflow in ImageMagick MVG decoder (GHSA-x9h5-r9v2-vcww) - Heap overflow caused by integer overflow/wraparound in viff encoder on 32-bit builds (GHSA-v67w-737x-v2c9) - Stack-buffer-overflow in MNG encoder with oversized pallete (GHSA-98cp-rj9f-6v5g) - Integer overflow in despeckle operation causes heap buffer overflow on 32-bit builds (GHSA-26qp-ffjh-2x4v) - Off-by-One in MSL decoder could result in crash (GHSA-5xg3-585r-9jh5) - Heap buffer overflow when encoding JXL image with a 16-bit float (GHSA-jvgr-9ph5-m8v4) - Heap-use-after-free via XMP profile could result in a crash when printing the values (GHSA-r83h-crwp-3vm7) - Heap buffer overflow (WRITE) in the YAML and JSON encoders (GHSA-5592-p365-24xh) - Heap out-of-bounds write in JP2 encoder (GHSA-pwg5-6jfc-crvh) ### Library updates: - ImageMagick 7.1.2-19 (2026-04-12) - aom 3.13.3 (2026-04-02) - openexr 3.4.9 (2026-04-03) - freetype 2.14.3 (2026-03-22) - gdk-pixbuf 2.44.6 (2026-03-31) - harfbuzz 14.0.0 (2026-04-01) - liblzma 5.8.3 (2026-04-31) - libpng 1.6.56 (2026-03-25) **Full Changelog**: dlemstra/Magick.NET@14.11.1...14.12.0 ## 14.11.1 ### Related changes in ImageMagick since the last release of Magick.NET: - Stack-buffer-overflow WRITE in InterpretImageFilename due to overflow (GHSA-8793-7xv6-82cf) ### Library updates: - ImageMagick 7.1.2-18 (2026-03-23) - aom 3.13.2 (2026-03-19) - openexr 3.4.7 (2026-03-15) - harfbuzz 13.2.1 (2026-03-19) **Full Changelog**: dlemstra/Magick.NET@14.11.0...14.11.1 ## 14.11.0 ### What's Changed - Added `DcmReadDefines`. ### Related changes in ImageMagick since the last release of Magick.NET: - Access mode change for files created from 0666 to 0600 (ImageMagick/ImageMagick#8609) - Heap-buffer-overflow in NewXMLTree could result in crash (GHSA-gc62-2v5p-qpmp) ### Library updates: - ImageMagick 7.1.2-17 (2026-03-16) - openexr 3.4.6 (2026-03-01) - freetype 2.14.2 (2026-03-01) - harfbuzz 13.0.1 (2026-03-07) - libxml2 2.15.2 (2026-03-03) **Full Changelog**: dlemstra/Magick.NET@14.10.4...14.11.0 Commits viewable in [compare view](dlemstra/Magick.NET@14.10.4...14.12.0). </details> [](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/dotnet/maui/network/alerts). </details> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…t#35333) Bump OpenTelemetry packages to latest stable versions in the maui-aspire-servicedefaults template: - OpenTelemetry.Exporter.OpenTelemetryProtocol: 1.9.0 to 1.15.3 - OpenTelemetry.Extensions.Hosting: 1.9.0 to 1.15.3 - OpenTelemetry.Instrumentation.Http: 1.9.0 to 1.15.1 - OpenTelemetry.Instrumentation.Runtime: 1.9.0 to 1.15.1 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This pull request updates the following dependencies [marker]: <> (Begin:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95) ## From https://github.com/dotnet/xharness - **Subscription**: [a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95](https://maestro.dot.net/subscriptions?search=a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95) - **Build**: [20260430.4](https://dev.azure.com/dnceng/internal/_build/results?buildId=2964906) ([312724](https://maestro.dot.net/channel/2/github:dotnet:xharness/build/312724)) - **Date Produced**: May 1, 2026 7:05:11 AM UTC - **Commit**: [92962e5c46ac08a66ded4c5696209cc60f1a232f](dotnet/xharness@92962e5) - **Branch**: [main](https://github.com/dotnet/xharness/tree/main) [DependencyUpdate]: <> (Begin) - **Dependency Updates**: - From [11.0.0-prerelease.26229.1 to 11.0.0-prerelease.26230.4][1] - Microsoft.DotNet.XHarness.CLI - Microsoft.DotNet.XHarness.TestRunners.Common - Microsoft.DotNet.XHarness.TestRunners.Xunit [1]: dotnet/xharness@9d5a7e9...92962e5 [DependencyUpdate]: <> (End) [marker]: <> (End:a71c12d9-5aa4-4b46-e2d6-08da0cf8cd95) Co-authored-by: dotnet-maestro[bot] <dotnet-maestro[bot]@users.noreply.github.com>
> [!NOTE] > Are you waiting for the changes in this PR to be merged? > It would be very helpful if you could [test the resulting artifacts](https://github.com/dotnet/maui/wiki/Testing-PR-Builds) from this PR and let us know in a comment if this change resolves your issue. Thank you! ## Description Replaces `review-rules.md` (flat 345-line checklist) with a dimensional expert review agent. Single source of truth for all review rules, organized into 30 dimensions for per-dimension sub-agent evaluation. Adds inline file:line PR comments alongside the existing wall-of-text summary. Extracted from 28k review comments across 5 maintainers via [extraction-pipeline](https://github.com/dotnet/fsharp/blob/main/.github/agents/extraction-pipeline.md). No functional code changes. Recreated from dotnet#35062 on a dotnet/maui branch (originally opened from a fork). ## What changed **Before:** `review-rules.md` had 345 lines of flat rules. `code-review` skill loaded them all into one context. Output was a single wall-of-text PR comment. **After:** Rules absorbed into `maui-expert-reviewer.md` as 30 dimensions with 200+ CHECK items. Each dimension runs as an independent sub-agent with focused context. Output is inline file:line PR comments via `inline-findings.json`. ## CI Flow ``` Review-PR.ps1 prompt: 1. code-review → maui-expert-reviewer agent → inline-findings.json 2. pr-review → Pre-Flight → Try-Fix → Report (sees findings, no duplication) Posting: post-inline-review.ps1 → .json → GitHub file:line comments (NEW) post-ai-summary-comment.ps1 → {phase}/content.md → wall-of-text (existing) CI: COMMENTS_VIA_FILE=true → agent writes .json, script posts Local: agent writes .json, code-review posts directly via gh api ``` ## Files | Action | File | What | |--------|------|------| | **Add** | `agents/maui-expert-reviewer.md` | 30 dimensions, 200+ CHECKs, routing table | | **Add** | `instructions/collectionview-{android,ios,windows}` | Platform-isolated CV rules | | **Add** | `instructions/{handler-patterns,layout-system,performance-hotpaths,public-api,threading-async}` | Domain-specific ambient guidance | | **Add** | `scripts/post-inline-review.ps1` | Posts .json as GitHub PR review | | **Del** | `skills/code-review/references/review-rules.md` | Absorbed into agent | | **Mod** | `skills/code-review/SKILL.md` | Delegates to agent | | **Mod** | `scripts/Review-PR.ps1` | Prompt + inline posting wiring | | **Mod** | `eng/pipelines/ci-copilot.yml` | `COMMENTS_VIA_FILE` env var | --------- Co-authored-by: kubaflo <kubaflo@users.noreply.github.com> Co-authored-by: T-Gro <46543583+T-Gro@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com>
|
🚀 Dogfood this PR with:
curl -fsSL https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.sh | bash -s -- 35374Or
iex "& { $(irm https://raw.githubusercontent.com/dotnet/maui/main/eng/scripts/get-maui-pr.ps1) } 35374" |
|
Hey there @@AdamEssenmacher! Thank you so much for your PR! Someone from the team will get assigned to your PR shortly and we'll get it reviewed. |
|
/azp run maui-pr |
There was a problem hiding this comment.
Pull request overview
Updates the iOS 26+ UIStepper “Liquid Glass” layout compensation used by StepperHandler.GetDesiredSize so that, in landscape orientation on iOS (not MacCatalyst), adjacent controls no longer render visually inside the stepper’s glass pill overflow on iOS 26.4.
Changes:
- Increase the landscape-only overflow compensation from 20pt to 36pt for iOS 26.4 behavior.
- Update inline documentation to reflect the new empirical measurement and re-verification details.
|
Azure Pipelines successfully started running 1 pipeline(s). |
🤖 AI Summary
📊 Review Session —
|
| Category | Result | Tests | Duration | Notes |
|---|---|---|---|---|
ViewBaseTests |
⏭️ SKIPPED | — | 0s | Runner threw an exception |
Failures here are informational only — they do not block the gate or affect try-fix candidate scoring.
✅ Deep UI tests — 112 passed, 0 failed across 1 category on platform-pool agent (replaces in-process counts above).
🧪 UI Test Execution Results (deep, platform pool)
| Category | Tests | Snapshot diffs |
|---|---|---|
ios_ui_tests-controls-ViewBaseTests |
112/112 ✓ | — |
| 📎 Download drop-deep-uitests artifact (TRX + snapshot diffs) |
🔍 Pre-Flight — Context & Validation
Pre-Flight — PR #35374
Summary
Fix iOS 26 Stepper overlap in landscape (issue #35211). PR extends an existing iOS 26 UIStepper Liquid Glass workaround:
src/Core/src/Handlers/Stepper/StepperHandler.iOS.cs- Constant
iOSLiquidGlassStepperOverflowchanged20 → 36pts. - Comments updated (measured on iOS 26.4 with a small safety margin).
- Constant
src/Controls/tests/TestCases.iOS.Tests/snapshots/ios-26/EditorNoOverlapAfterRotateToLandscape.png— visual baseline refreshed.
Issue context
- Issue: [.NET10] D10-The number and buttons overlap after rotating the simulator. #35211 — Stepper buttons/value overlap after rotating simulator (D10 in ManualMaui).
- Regressed in 10-rc2; reproduces on iOS 26 simulator landscape.
- Root cause: iOS 26
UIStepperLiquid Glass pill renders visually outside its logical UIKit frame; UIKit size APIs return pre-glass logical width (~94 pts). An earlier fix ([.NET10] D10 - Customize cursor position - Rotating simulator makes the button and label overlap #34273) added a 20 pt landscape compensation; on iOS 26.4 the pill extends further so adjacent controls in horizontal layouts still overlap the visible pill.
Classification
- Files: 1 .ios.cs handler + 1 snapshot PNG.
- Risk: low — code change is a constant + comments; logical control flow unchanged.
- iOS only, MacCatalyst excluded, iOS 26+ gated, landscape gated.
- No public API changes.
Gate
Gate Passed: 2, Failed: 0).
Code-review summary (advisory hints for Try-Fix)
- ❌ Errors: None — guards and platform checks remain correct.
⚠️ Warnings:- Magic constant approach: bumping 20 → 36 is empirical and unstable across iOS minor versions. The same pattern already shipped once and now needs a 2nd tune; a more principled approach (read from rendered glass layer bounds or insets) would be more durable.
- Safety-margin amount not documented (is 36 = 28 measured + 8 margin? unclear). Future maintainers won't know which part is "real" vs "buffer".
UIScreen.MainScreen.Boundsis used for orientation — deprecated/unreliable in multi-window scenarios. Existing pattern is preserved, but could yield wrong compensation on iPad split-view or external display.- Snapshot test path is iOS-26-specific; the updated baseline is only verified for one simulator/device. iPad / iPhone Pro Max landscape may still overflow if width differs.
- 💡 Suggestions:
- Consider deriving overflow from
UIStepper.Layer.FramevsBoundspost-layout (one-time on first layout), falling back to constant. - Apply compensation to both leading + trailing or use a measured per-orientation value.
- Consider deriving overflow from
- Failure modes:
- iOS 26.5+ further increases overflow → constant becomes stale again.
- Stepper inside RTL
HorizontalStackLayout: overflow is on UIKit trailing edge; in RTL, trailing is opposite of LTR. Current code adds to width regardless — if the visible overflow is leading in RTL, the wrong side gets padded. - Stepper inside scroll views / non-stack layouts: extra width creates unused space on the right.
- Blast radius: Runs in
GetDesiredSizefor everyStepperon iOS 26+ in landscape. Negligible perf cost; visible layout impact only. - Verdict: NEEDS_DISCUSSION (low-medium confidence) — fix solves the reported case but doubles the magic constant; principled alternatives exist.
Test evidence
- PR description states
Issue34273visual tests pass on iPhone 11 Pro iOS 26.4 (2/0). - Visual snapshot updated.
Platform for testing
iOS (per task input).
🔧 Fix — Analysis & Comparison
Try-Fix Aggregate Summary — PR #35374
Four independent fix candidates were generated using different maui-expert-reviewer dimensions. None were executed against an iOS 26.4 simulator (no test infrastructure available in the autonomous environment), so all test-result columns are marked
Fix Candidates
| # | Source | Dimension | Approach | Test Result | Files Changed | Notes |
|---|---|---|---|---|---|---|
| 1 | try-fix-1 | Handler patterns / Layout | Derive overflow from AlignmentRectInsets at runtime |
1 | Pre-flight notes state AlignmentRectInsets reports pre-glass size; would regress fix |
|
| 2 | try-fix-2 | iOS Platform / version | Apply 36 only on iOS 26.4+, keep 20 for 26.0-26.3 |
1 | Plausible; conservative for already-shipped subversions | |
| 3 | try-fix-3 | Performance / regression | Replace UIScreen.MainScreen with Window.WindowScene.InterfaceOrientation |
1 | Good follow-up cleanup, wrong scope for SR fix | |
| 4 | try-fix-4 | API design / extensibility | Convert const to internal tunable static |
1 | Marginal benefit, new mutable static — reject | |
| pr | PR #35374 | (submitted fix) | Bump 20 → 36, refresh snapshot |
✅ Author validated: Issue34273 iOS visual tests 2/0 on iPhone 11 Pro iOS 26.4 |
2 | Minimal, surgical |
| pr+rev | Branch A | Code review applied | Split 36 = 30 measured + 6 safety + tighter comments |
✅ Behaviorally identical to pr |
1 | Adds maintainability without behavior change |
Cross-Pollination
| Model / dimension | Round | New Ideas? | Details |
|---|---|---|---|
| Handler patterns | 2 | No | Dynamic measurement blocked by UIKit reporting pre-glass size |
| iOS Platform | 2 | No | Version-scoped constant already covered |
| Performance/regression | 2 | No | Multi-window orientation already proposed; out of scope |
| API design | 2 | No | Tunable static already proposed; not worth the surface |
Exhausted: Yes — no new viable ideas after cross-pollination.
Selected Fix
pr-plus-reviewer — keeps the PR's minimal, validated behavior change (constant bumped, snapshot refreshed) and layers on a low-risk maintainability improvement (split into measured + safety constants; concrete iOS subversion documented; de-duplicated comment).
pr is also acceptable to merge as-is — pr-plus-reviewer is a strict super-set, never worse. The four try-fix alternatives are either incorrect (try-fix-1), out-of-scope (try-fix-3), or strictly inferior (try-fix-2 unnecessarily branches; try-fix-4 adds mutable surface).
Test verification caveat
All candidates that change behavior would need to be validated on an iOS 26.4 simulator against the Issue34273 visual tests. Only pr has that validation (per PR description); pr-plus-reviewer inherits it because the behavior is bit-identical.
📋 Report — Final Recommendation
Phase 3 — Report
Candidate ranking
| Rank | Candidate | Verified behavior | Risk | Maintainability | Verdict |
|---|---|---|---|---|---|
| 🥇 1 | pr-plus-reviewer |
✅ Behavior-identical to pr (same 36 total) |
Low | Best — measured + safety split, concrete iOS subversion documented | Recommend |
| 🥈 2 | pr |
✅ Author-validated Issue34273 2/0 on iOS 26.4 |
Low | Good — minimal, surgical | Acceptable as-is |
| 3 | try-fix-2 |
Low-medium | OK — adds version branch | Plausible alternative; depends on whether iOS 26.0-26.3 needed 36 or 20 |
|
| 4 | try-fix-3 |
Medium | Cleanup, not a fix | Out of scope for SR fix — file separately | |
| 5 | try-fix-4 |
Low | Marginal | Rejects added mutable static for no behavior gain | |
| 6 | try-fix-1 |
❌ Static analysis FAIL — AlignmentRectInsets reports pre-glass size |
High | Would regress fix | Rejected |
Test verification ranking note
Per the task rules, candidates that failed regression tests rank below ones that passed. Only pr has direct verification (per author description); pr-plus-reviewer is byte-identical at runtime so it inherits that verification. Try-fix-1 is statically known to break the fix; ranked last. The other try-fix candidates are unverified — ranked below the verified pair.
Selected winner: pr-plus-reviewer
The PR's behavioral change (bump iOSLiquidGlassStepperOverflow 20 → 36 in landscape on iOS 26+) is correct and validated for the reported scenario. The maintainability concerns flagged by code review are real (the constant has been retuned twice across iOS 26.x; the safety margin amount is undocumented in the PR). pr-plus-reviewer keeps the same compensation amount and same control flow, but splits the literal into measured + safety and pins a concrete iOS subversion in the comment — so the next maintainer touching this code on iOS 26.5 has the data they need.
If the team prefers minimal SR diffs, pr is also fine to merge as-is. The expert review feedback can land as a separate cleanup PR.
What was NOT verified
- All try-fix candidates were not run against an iOS 26.4 simulator (no test infra in the autonomous environment).
- iPad multi-window orientation behavior (raised by try-fix-3) is not covered by the existing
Issue34273visual tests. - iOS 26.0-26.3 layout (raised by try-fix-2) is not separately validated; the
36value may over-pad on those subversions.
Suggested PR follow-ups (not blocking merge)
- Author should consider applying the
pr-plus-reviewercomment/constant split (see inline findings). - Track migration off
UIScreen.MainScreen.BoundstoWindowScene.InterfaceOrientationfor iPad multi-window correctness (try-fix-3) as a separate cleanup issue. - Add a unit test that asserts
GetDesiredSizereportslogical_width + 36in landscape on iOS 26+ (mockable viaIsLandscapeextraction) so future tuning is regression-protected without needing a visual snapshot run.
### Description of Change Extends the existing iOS 26 `UIStepper` Liquid Glass workaround for landscape orientation. On iOS 26.4, the stepper glass pill can render farther outside its logical UIKit bounds than the previous `20pt` compensation covered, causing adjacent controls in horizontal layouts to appear inside the visible stepper pill. This updates the landscape-only compensation to `36pt`, keeps the existing iOS 26+ and non-MacCatalyst guards, and refreshes only the affected iOS 26 landscape visual baseline. No public API changes. Validation performed: - Built and ran ManualTests on iOS 26.4. - Verified `D Editor -> D10` in landscape; the `0` label is fully outside the stepper glass pill. - Rechecked the same ManualTests scenario on iOS 18.6; layout remains unchanged. - Ran the existing Issue34273 iOS visual tests on iPhone 11 Pro iOS 26.4: - `Passed: 2, Failed: 0` ### Issues Fixed Fixes #35211 ---------
### Description of Change Extends the existing iOS 26 `UIStepper` Liquid Glass workaround for landscape orientation. On iOS 26.4, the stepper glass pill can render farther outside its logical UIKit bounds than the previous `20pt` compensation covered, causing adjacent controls in horizontal layouts to appear inside the visible stepper pill. This updates the landscape-only compensation to `36pt`, keeps the existing iOS 26+ and non-MacCatalyst guards, and refreshes only the affected iOS 26 landscape visual baseline. No public API changes. Validation performed: - Built and ran ManualTests on iOS 26.4. - Verified `D Editor -> D10` in landscape; the `0` label is fully outside the stepper glass pill. - Rechecked the same ManualTests scenario on iOS 18.6; layout remains unchanged. - Ran the existing Issue34273 iOS visual tests on iPhone 11 Pro iOS 26.4: - `Passed: 2, Failed: 0` ### Issues Fixed Fixes #35211 ---------
Description of Change
Extends the existing iOS 26
UIStepperLiquid Glass workaround for landscape orientation.On iOS 26.4, the stepper glass pill can render farther outside its logical UIKit bounds than the previous
20ptcompensation covered, causing adjacent controls in horizontal layouts to appear inside the visible stepper pill. This updates the landscape-only compensation to36pt, keeps the existing iOS 26+ and non-MacCatalyst guards, and refreshes only the affected iOS 26 landscape visual baseline.No public API changes.
Validation performed:
D Editor -> D10in landscape; the0label is fully outside the stepper glass pill.Passed: 2, Failed: 0Issues Fixed
Fixes #35211