From db3612fafbec167ef72a0879d17788f90c5bceb4 Mon Sep 17 00:00:00 2001 From: Mike Mertsock Date: Mon, 24 Aug 2026 10:17:24 -0400 Subject: [PATCH 01/10] SF Symbols / liquid glass compatibility for back buttons --- Cartfile.resolved | 2 +- Carthage/Checkouts/MarkdownAttributedString | 2 +- .../Common/UIBarButtonItem+ORK1BarButtonItem.m | 14 ++------------ .../Common/UIBarButtonItem+ORKBarButtonItem.m | 14 ++------------ .../ORKCatalog.xcodeproj/project.pbxproj | 4 ++-- ...insonStudy WatchKit App (Complication).xcscheme | 2 -- ...insonStudy WatchKit App (Notification).xcscheme | 2 -- .../ORKParkinsonStudy WatchKit App.xcscheme | 2 -- 8 files changed, 8 insertions(+), 34 deletions(-) diff --git a/Cartfile.resolved b/Cartfile.resolved index da07c63098..91dec9ef89 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1 +1 @@ -github "CareEvolution/MarkdownAttributedString" "1.0.4" +github "CareEvolution/MarkdownAttributedString" "1.0.5" diff --git a/Carthage/Checkouts/MarkdownAttributedString b/Carthage/Checkouts/MarkdownAttributedString index e9dd6fe902..6fc2f19792 160000 --- a/Carthage/Checkouts/MarkdownAttributedString +++ b/Carthage/Checkouts/MarkdownAttributedString @@ -1 +1 @@ -Subproject commit e9dd6fe9026acb85bcf89c12843342b8df2b8e0f +Subproject commit 6fc2f197928812d64938ac6e34135cc2c91108aa diff --git a/ORK1Kit/ORK1Kit/Common/UIBarButtonItem+ORK1BarButtonItem.m b/ORK1Kit/ORK1Kit/Common/UIBarButtonItem+ORK1BarButtonItem.m index f1586fff0a..1143d81d62 100644 --- a/ORK1Kit/ORK1Kit/Common/UIBarButtonItem+ORK1BarButtonItem.m +++ b/ORK1Kit/ORK1Kit/Common/UIBarButtonItem+ORK1BarButtonItem.m @@ -37,19 +37,9 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE @implementation UIBarButtonItem (ORK1BarButtonItem) + (UIBarButtonItem *)ork_backBarButtonItemWithTarget:(id)target action:(SEL)selector { - NSString *regularImageName = @"arrowLeft"; - NSString *landscapeImageName = @"arrowLeftLandscape"; - - if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft ) { - regularImageName = @"arrowRight"; - landscapeImageName = @"arrowRightLandscape"; - } - - UIImage *image = [UIImage imageNamed:regularImageName inBundle:ORK1Bundle() compatibleWithTraitCollection:nil]; - UIImage *landscapeImage = [UIImage imageNamed:landscapeImageName inBundle:ORK1Bundle() compatibleWithTraitCollection:nil]; + UIImage *image = [UIImage systemImageNamed:@"chevron.backward"]; UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:image - landscapeImagePhone:landscapeImage - style:UIBarButtonItemStyleDone + style:UIBarButtonItemStylePlain target:target action:selector]; item.accessibilityLabel = ORK1LocalizedString(@"AX_BUTTON_BACK", nil); diff --git a/ResearchKit/Common/UIBarButtonItem+ORKBarButtonItem.m b/ResearchKit/Common/UIBarButtonItem+ORKBarButtonItem.m index df64f44029..24f31e2719 100644 --- a/ResearchKit/Common/UIBarButtonItem+ORKBarButtonItem.m +++ b/ResearchKit/Common/UIBarButtonItem+ORKBarButtonItem.m @@ -37,19 +37,9 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE @implementation UIBarButtonItem (ORKBarButtonItem) + (UIBarButtonItem *)ork_backBarButtonItemWithTarget:(id)target action:(SEL)selector { - NSString *regularImageName = @"arrowLeft"; - NSString *landscapeImageName = @"arrowLeftLandscape"; - - if ([UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionRightToLeft ) { - regularImageName = @"arrowRight"; - landscapeImageName = @"arrowRightLandscape"; - } - - UIImage *image = [UIImage imageNamed:regularImageName inBundle:ORKBundle() compatibleWithTraitCollection:nil]; - UIImage *landscapeImage = [UIImage imageNamed:landscapeImageName inBundle:ORKBundle() compatibleWithTraitCollection:nil]; + UIImage *image = [UIImage systemImageNamed:@"chevron.backward"]; UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:image - landscapeImagePhone:landscapeImage - style:UIBarButtonItemStyleDone + style:UIBarButtonItemStylePlain target:target action:selector]; item.accessibilityLabel = ORKLocalizedString(@"AX_BUTTON_BACK", nil); diff --git a/samples/ORKCatalog/ORKCatalog.xcodeproj/project.pbxproj b/samples/ORKCatalog/ORKCatalog.xcodeproj/project.pbxproj index 5dcaa384a1..65ffc7e5d0 100644 --- a/samples/ORKCatalog/ORKCatalog.xcodeproj/project.pbxproj +++ b/samples/ORKCatalog/ORKCatalog.xcodeproj/project.pbxproj @@ -81,7 +81,7 @@ 246DFA261BEAE26200591E9A /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = en_GB.lproj/Localizable.strings; sourceTree = ""; }; 246DFA271BEAE27000591E9A /* en-AU */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-AU"; path = en_AU.lproj/Localizable.strings; sourceTree = ""; }; 246DFA281BEAE2A800591E9A /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = zh_HK.lproj/Localizable.strings; sourceTree = ""; }; - 3E39B9E81ABF675000C2ABE5 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 3E39B9E81ABF675000C2ABE5 /* readme.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = readme.md; sourceTree = ""; }; 3E39B9FA1ABF682D00C2ABE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 3E39B9FD1ABF683700C2ABE5 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 3E39B9FF1ABF683F00C2ABE5 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; @@ -152,7 +152,7 @@ 869230B51AAA890A00BFE11B = { isa = PBXGroup; children = ( - 3E39B9E81ABF675000C2ABE5 /* README.md */, + 3E39B9E81ABF675000C2ABE5 /* readme.md */, BC2A3C9E1C58E81500DA64B7 /* Frameworks */, 869230C01AAA890A00BFE11B /* ORKCatalog */, 869230BF1AAA890A00BFE11B /* Products */, diff --git a/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App (Complication).xcscheme b/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App (Complication).xcscheme index 89e37779c1..edd5adcfce 100644 --- a/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App (Complication).xcscheme +++ b/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App (Complication).xcscheme @@ -70,7 +70,6 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "BA87DBAF20B80FFD004ACAFF" BuildableName = "ORKParkinsonStudy WatchKit App.app" - BlueprintName = "ORKParkinsonStudy WatchKit App" ReferencedContainer = "container:ORKParkinsonStudy.xcodeproj"> @@ -88,7 +87,6 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "BA87DBAF20B80FFD004ACAFF" BuildableName = "ORKParkinsonStudy WatchKit App.app" - BlueprintName = "ORKParkinsonStudy WatchKit App" ReferencedContainer = "container:ORKParkinsonStudy.xcodeproj"> diff --git a/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App (Notification).xcscheme b/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App (Notification).xcscheme index 3b3dae5626..a79b54de50 100644 --- a/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App (Notification).xcscheme +++ b/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App (Notification).xcscheme @@ -71,7 +71,6 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "BA87DBAF20B80FFD004ACAFF" BuildableName = "ORKParkinsonStudy WatchKit App.app" - BlueprintName = "ORKParkinsonStudy WatchKit App" ReferencedContainer = "container:ORKParkinsonStudy.xcodeproj"> @@ -90,7 +89,6 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "BA87DBAF20B80FFD004ACAFF" BuildableName = "ORKParkinsonStudy WatchKit App.app" - BlueprintName = "ORKParkinsonStudy WatchKit App" ReferencedContainer = "container:ORKParkinsonStudy.xcodeproj"> diff --git a/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App.xcscheme b/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App.xcscheme index 7222a21df3..e4ce87b148 100644 --- a/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App.xcscheme +++ b/samples/ORKParkinsonStudy/ORKParkinsonStudy.xcodeproj/xcshareddata/xcschemes/ORKParkinsonStudy WatchKit App.xcscheme @@ -69,7 +69,6 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "BA87DBAF20B80FFD004ACAFF" BuildableName = "ORKParkinsonStudy WatchKit App.app" - BlueprintName = "ORKParkinsonStudy WatchKit App" ReferencedContainer = "container:ORKParkinsonStudy.xcodeproj"> @@ -86,7 +85,6 @@ BuildableIdentifier = "primary" BlueprintIdentifier = "BA87DBAF20B80FFD004ACAFF" BuildableName = "ORKParkinsonStudy WatchKit App.app" - BlueprintName = "ORKParkinsonStudy WatchKit App" ReferencedContainer = "container:ORKParkinsonStudy.xcodeproj"> From 02b15a260ffbba9ca185f608ef633105e30ab5b3 Mon Sep 17 00:00:00 2001 From: Mike Mertsock Date: Wed, 26 Aug 2026 23:49:38 -0400 Subject: [PATCH 02/10] WIP: liquid glass: progress view layout, misc. fixes --- .../Common/CEVRK1NavigationBarProgressView.h | 4 +- .../Common/CEVRK1NavigationBarProgressView.m | 20 +++++----- .../ORK1Kit/Common/ORK1TaskViewController.m | 39 +++++++++++++++---- .../Consent/ORK1ConsentReviewController.m | 2 +- ResearchKit/Common/ORKTaskViewController.m | 6 ++- 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.h b/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.h index 1753f27d2f..50654b5a13 100644 --- a/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.h +++ b/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.h @@ -16,6 +16,8 @@ @interface CEVRK1NavigationBarProgressView : UIView -- (void)setProgress:(float)progress withTheme:(nullable CEVRK1Theme *)theme; +@property (nonatomic, readonly) float progress; + +- (void)setProgress:(float)progress withTheme:(nullable CEVRK1Theme *)theme animated:(BOOL)animated; @end diff --git a/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m b/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m index e06c7771c7..4364137385 100644 --- a/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m +++ b/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m @@ -27,25 +27,25 @@ - (instancetype)initWithFrame:(CGRect)frame { - (void)createConstraints { _progressView = [[UIProgressView alloc] initWithFrame:CGRectZero]; + _progressView.backgroundColor = [UIColor whiteColor]; _progressView.progress = 0; self.accessibilityElements = @[_progressView]; self.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:_progressView]; _progressView.translatesAutoresizingMaskIntoConstraints = NO; - // This forces the bar to stretch so the ORK1ProgressView will attempt to take up the entire available width - NSLayoutConstraint *widthConstraint = [self.widthAnchor constraintEqualToConstant:200]; - widthConstraint.priority = UILayoutPriorityDefaultHigh; [NSLayoutConstraint activateConstraints:@[ - [_progressView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:10], - [_progressView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:-30], - [_progressView.centerYAnchor constraintEqualToAnchor:self.centerYAnchor], - widthConstraint - ]]; + [_progressView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:0], //10], + [_progressView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:0], //-30], + ]]; } -- (void)setProgress:(float)progress withTheme:(nullable CEVRK1Theme *)theme { - _progressView.progress = progress; +- (float)progress { + return _progressView.progress; +} + +- (void)setProgress:(float)progress withTheme:(nullable CEVRK1Theme *)theme animated:(BOOL)animated { + [_progressView setProgress:progress animated:animated]; if (theme.progressBarColor) { _progressView.tintColor = theme.progressBarColor; } diff --git a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m index 4311b14db0..2856dadb8b 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m @@ -279,7 +279,6 @@ - (instancetype)commonInitWithTask:(id)task taskRunUUID:(NSUUID *)task self.taskRunUUID = taskRunUUID; - [self.childNavigationController.navigationBar setShadowImage:[UIImage new]]; self.hairline = [self findHairlineViewUnder:self.childNavigationController.navigationBar]; self.hairline.alpha = 0.0f; self.childNavigationController.toolbar.clipsToBounds = YES; @@ -1037,13 +1036,8 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B } else { // Linear calculatedProgress = (float)taskProgress.current / (float)taskProgress.total; } - [strongSelf.progressView setProgress:calculatedProgress withTheme:[CEVRK1Theme themeForElement:strongSelf.currentStepViewController]]; - strongSelf.pageViewController.navigationItem.titleView = strongSelf.progressView; - - // for UITesting, we will add a title that will not display, but should appear via accessibility - NSUInteger progressPercent = (NSUInteger)(calculatedProgress * 100); - strongSelf.pageViewController.navigationItem.title = [NSString stringWithFormat:@"ProgressBar:%@", @(progressPercent)]; - + [strongSelf.progressView setProgress:calculatedProgress withTheme:[CEVRK1Theme themeForElement:strongSelf.currentStepViewController] animated:animated]; + [strongSelf configureProgressView]; } else { strongSelf.pageViewController.navigationItem.titleView = nil; strongSelf.pageViewController.navigationItem.title = [NSString localizedStringWithFormat:ORK1LocalizedString(@"STEP_PROGRESS_FORMAT", nil) ,ORK1LocalizedStringFromNumber(@(taskProgress.current)), ORK1LocalizedStringFromNumber(@(taskProgress.total))]; @@ -1058,6 +1052,35 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B }]; } +- (void)configureProgressView { + if (@available(iOS 26.0, *)) { + self.pageViewController.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; + self.pageViewController.navigationItem.title = nil; + + CEVRK1NavigationBarProgressView *progressView = self.progressView; + if (!progressView.superview) { + NSLog(@"configure progress"); + UINavigationBar *navigationBar = self.childNavigationController.navigationBar; + navigationBar.opaque = YES; + navigationBar.translucent = NO; + + progressView.translatesAutoresizingMaskIntoConstraints = NO; + [navigationBar addSubview:progressView]; + [NSLayoutConstraint activateConstraints:@[ + [NSLayoutConstraint constraintWithItem:progressView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:navigationBar attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0], + [NSLayoutConstraint constraintWithItem:progressView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:navigationBar.safeAreaLayoutGuide attribute:NSLayoutAttributeLeftMargin multiplier:1.0 constant:10], + [NSLayoutConstraint constraintWithItem:progressView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:navigationBar.safeAreaLayoutGuide attribute:NSLayoutAttributeRightMargin multiplier:1.0 constant:-10] + ]]; + } + } else { + self.pageViewController.navigationItem.titleView = self.progressView; + + // for UITesting, we will add a title that will not display, but should appear via accessibility + NSUInteger progressPercent = (NSUInteger)(self.progressView.progress * 100); + self.pageViewController.navigationItem.title = [NSString stringWithFormat:@"ProgressBar:%@", @(progressPercent)]; + } +} + - (BOOL)shouldPresentStep:(ORK1Step *)step { BOOL shouldPresent = (step != nil); diff --git a/ORK1Kit/ORK1Kit/Consent/ORK1ConsentReviewController.m b/ORK1Kit/ORK1Kit/Consent/ORK1ConsentReviewController.m index f493f05c90..026e5785ba 100644 --- a/ORK1Kit/ORK1Kit/Consent/ORK1ConsentReviewController.m +++ b/ORK1Kit/ORK1Kit/Consent/ORK1ConsentReviewController.m @@ -60,7 +60,7 @@ - (instancetype)initWithHTML:(NSString *)html delegate:(id Date: Thu, 27 Aug 2026 14:49:57 -0400 Subject: [PATCH 03/10] Opaque nav bar. Fix progress bar visibility logic. RK2 keyboard accessory Done button. Preserve iOS 18 look. --- .../Common/CEVRK1NavigationBarProgressView.m | 22 ++++++++++++++----- .../ORK1Kit/Common/ORK1TaskViewController.m | 8 +++++++ ResearchKit/Common/ORKAnswerTextField.m | 16 +++++++++----- ResearchKit/Common/ORKAnswerTextView.m | 14 ++++++++---- 4 files changed, 46 insertions(+), 14 deletions(-) diff --git a/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m b/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m index 4364137385..e4998578e2 100644 --- a/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m +++ b/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m @@ -27,17 +27,29 @@ - (instancetype)initWithFrame:(CGRect)frame { - (void)createConstraints { _progressView = [[UIProgressView alloc] initWithFrame:CGRectZero]; - _progressView.backgroundColor = [UIColor whiteColor]; _progressView.progress = 0; self.accessibilityElements = @[_progressView]; self.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:_progressView]; _progressView.translatesAutoresizingMaskIntoConstraints = NO; - [NSLayoutConstraint activateConstraints:@[ - [_progressView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:0], //10], - [_progressView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:0], //-30], - ]]; + if (@available(iOS 26.0, *)) { + _progressView.backgroundColor = [UIColor whiteColor]; + [NSLayoutConstraint activateConstraints:@[ + [_progressView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:0], //10], + [_progressView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:0], //-30], + ]]; + } else { + // This forces the bar to stretch so the ORK1ProgressView will attempt to take up the entire available width + NSLayoutConstraint *widthConstraint = [self.widthAnchor constraintEqualToConstant:200]; + widthConstraint.priority = UILayoutPriorityDefaultHigh; + [NSLayoutConstraint activateConstraints:@[ + [_progressView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:10], + [_progressView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:-30], + [_progressView.centerYAnchor constraintEqualToAnchor:self.centerYAnchor], + widthConstraint + ]]; + } } - (float)progress { diff --git a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m index 2856dadb8b..f86cd11a83 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m @@ -283,6 +283,11 @@ - (instancetype)commonInitWithTask:(id)task taskRunUUID:(NSUUID *)task self.hairline.alpha = 0.0f; self.childNavigationController.toolbar.clipsToBounds = YES; + if (@available(iOS 26.0, *)) { + // ResearchKit views render poorly with translucent navigation bars on iOS 26 + self.childNavigationController.navigationBar.backgroundColor = [UIColor whiteColor]; + } + // Ensure taskRunUUID has non-nil valuetaskRunUUID (void)[self taskRunUUID]; self.restorationClass = [ORK1TaskViewController class]; @@ -1026,6 +1031,7 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B // remove any progress strongSelf.pageViewController.navigationItem.titleView = nil; strongSelf.pageViewController.navigationItem.title = nil; + strongSelf.progressView.hidden = YES; } else { ORK1OrderedTask *orderedTask = (ORK1OrderedTask *)strongSelf.task; if (orderedTask.progressIndicatorStyle == CEVRK1TaskProgressIndicatorStyleBar) { @@ -1038,9 +1044,11 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B } [strongSelf.progressView setProgress:calculatedProgress withTheme:[CEVRK1Theme themeForElement:strongSelf.currentStepViewController] animated:animated]; [strongSelf configureProgressView]; + strongSelf.progressView.hidden = NO; } else { strongSelf.pageViewController.navigationItem.titleView = nil; strongSelf.pageViewController.navigationItem.title = [NSString localizedStringWithFormat:ORK1LocalizedString(@"STEP_PROGRESS_FORMAT", nil) ,ORK1LocalizedStringFromNumber(@(taskProgress.current)), ORK1LocalizedStringFromNumber(@(taskProgress.total))]; + strongSelf.progressView.hidden = YES; } } } diff --git a/ResearchKit/Common/ORKAnswerTextField.m b/ResearchKit/Common/ORKAnswerTextField.m index cf35d8157f..ee1614dc0f 100644 --- a/ResearchKit/Common/ORKAnswerTextField.m +++ b/ResearchKit/Common/ORKAnswerTextField.m @@ -68,11 +68,17 @@ - (void)addAccessoryViewWithDoneButton { UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; - UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] - initWithBarButtonSystemItem:UIBarButtonSystemItemDone - target:self action:@selector(keyboardAccessoryViewDoneButtonPressed)]; + UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"BUTTON_DONE", nil) style:UIBarButtonItemStylePlain target:self action:@selector(keyboardAccessoryViewDoneButtonPressed)]; + + if (@available(iOS 26.0, *)) { + doneButton.hidesSharedBackground = YES; + accessoryViewWithDoneButton.backgroundColor = ORKColor(ORKToolBarTintColorKey); + doneButton.tintColor = ORKViewTintColor(self); + } else { + [accessoryViewWithDoneButton setBarTintColor:ORKColor(ORKBackgroundColorKey)]; + } + accessoryViewWithDoneButton.items = @[flexibleSpace, doneButton]; - [accessoryViewWithDoneButton setBarTintColor:ORKColor(ORKBackgroundColorKey)]; self.inputAccessoryView = accessoryViewWithDoneButton; } @@ -104,4 +110,4 @@ - (CGRect)accessibilityFrame { return [super accessibilityFrame]; } -@end \ No newline at end of file +@end diff --git a/ResearchKit/Common/ORKAnswerTextView.m b/ResearchKit/Common/ORKAnswerTextView.m index f8608f5040..0ac365a9ce 100644 --- a/ResearchKit/Common/ORKAnswerTextView.m +++ b/ResearchKit/Common/ORKAnswerTextView.m @@ -84,11 +84,17 @@ - (void)addAccessoryViewWithDoneButton { UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; - UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] - initWithBarButtonSystemItem:UIBarButtonSystemItemDone - target:self action:@selector(keyboardAccessoryViewDoneButtonPressed)]; + UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:ORKLocalizedString(@"BUTTON_DONE", nil) style:UIBarButtonItemStylePlain target:self action:@selector(keyboardAccessoryViewDoneButtonPressed)]; + + if (@available(iOS 26.0, *)) { + doneButton.hidesSharedBackground = YES; + accessoryViewWithDoneButton.backgroundColor = ORKColor(ORKToolBarTintColorKey); + doneButton.tintColor = ORKViewTintColor(self); + } else { + [accessoryViewWithDoneButton setBarTintColor:ORKColor(ORKBackgroundColorKey)]; + } + accessoryViewWithDoneButton.items = @[flexibleSpace, doneButton]; - [accessoryViewWithDoneButton setBarTintColor:ORKColor(ORKBackgroundColorKey)]; self.inputAccessoryView = accessoryViewWithDoneButton; } From 5f881c1a7ca4b8dae28b804596a54feef72e5ef3 Mon Sep 17 00:00:00 2001 From: Mike Mertsock Date: Thu, 27 Aug 2026 15:08:51 -0400 Subject: [PATCH 04/10] Xcode updates --- .../ORK1Kit.xcodeproj/xcshareddata/xcschemes/ORK1Kit.xcscheme | 2 +- ORK1Kit/ORK1Kit.xcodeproj/xcshareddata/xcschemes/docs.xcscheme | 2 +- .../xcshareddata/xcschemes/ResearchKit.xcscheme | 2 +- ResearchKit.xcodeproj/xcshareddata/xcschemes/docs.xcscheme | 2 +- .../ORKTest.xcodeproj/xcshareddata/xcschemes/ORKTest.xcscheme | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ORK1Kit/ORK1Kit.xcodeproj/xcshareddata/xcschemes/ORK1Kit.xcscheme b/ORK1Kit/ORK1Kit.xcodeproj/xcshareddata/xcschemes/ORK1Kit.xcscheme index 3231f6b58c..aae8d1558f 100644 --- a/ORK1Kit/ORK1Kit.xcodeproj/xcshareddata/xcschemes/ORK1Kit.xcscheme +++ b/ORK1Kit/ORK1Kit.xcodeproj/xcshareddata/xcschemes/ORK1Kit.xcscheme @@ -1,6 +1,6 @@ Date: Wed, 2 Sep 2026 20:12:52 -0500 Subject: [PATCH 05/10] fix progress bar with insets and vertical constraints --- .../Common/CEVRK1NavigationBarProgressView.m | 6 ++++-- .../ORK1Kit/Common/ORK1TaskViewController.m | 18 +++++++++++++----- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m b/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m index e4998578e2..ee3da3f7a9 100644 --- a/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m +++ b/ORK1Kit/ORK1Kit/Common/CEVRK1NavigationBarProgressView.m @@ -36,8 +36,10 @@ - (void)createConstraints { if (@available(iOS 26.0, *)) { _progressView.backgroundColor = [UIColor whiteColor]; [NSLayoutConstraint activateConstraints:@[ - [_progressView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor constant:0], //10], - [_progressView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor constant:0], //-30], + [_progressView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], + [_progressView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], + [_progressView.topAnchor constraintEqualToAnchor:self.topAnchor], + [_progressView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], ]]; } else { // This forces the bar to stretch so the ORK1ProgressView will attempt to take up the entire available width diff --git a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m index f86cd11a83..9278799a1e 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m @@ -1032,6 +1032,9 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B strongSelf.pageViewController.navigationItem.titleView = nil; strongSelf.pageViewController.navigationItem.title = nil; strongSelf.progressView.hidden = YES; + if (@available(iOS 26.0, *)) { + strongSelf.pageViewController.additionalSafeAreaInsets = UIEdgeInsetsZero; + } } else { ORK1OrderedTask *orderedTask = (ORK1OrderedTask *)strongSelf.task; if (orderedTask.progressIndicatorStyle == CEVRK1TaskProgressIndicatorStyleBar) { @@ -1049,6 +1052,9 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B strongSelf.pageViewController.navigationItem.titleView = nil; strongSelf.pageViewController.navigationItem.title = [NSString localizedStringWithFormat:ORK1LocalizedString(@"STEP_PROGRESS_FORMAT", nil) ,ORK1LocalizedStringFromNumber(@(taskProgress.current)), ORK1LocalizedStringFromNumber(@(taskProgress.total))]; strongSelf.progressView.hidden = YES; + if (@available(iOS 26.0, *)) { + strongSelf.pageViewController.additionalSafeAreaInsets = UIEdgeInsetsZero; + } } } } @@ -1067,19 +1073,21 @@ - (void)configureProgressView { CEVRK1NavigationBarProgressView *progressView = self.progressView; if (!progressView.superview) { - NSLog(@"configure progress"); UINavigationBar *navigationBar = self.childNavigationController.navigationBar; navigationBar.opaque = YES; navigationBar.translucent = NO; - + progressView.translatesAutoresizingMaskIntoConstraints = NO; [navigationBar addSubview:progressView]; [NSLayoutConstraint activateConstraints:@[ - [NSLayoutConstraint constraintWithItem:progressView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:navigationBar attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0], - [NSLayoutConstraint constraintWithItem:progressView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:navigationBar.safeAreaLayoutGuide attribute:NSLayoutAttributeLeftMargin multiplier:1.0 constant:10], - [NSLayoutConstraint constraintWithItem:progressView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:navigationBar.safeAreaLayoutGuide attribute:NSLayoutAttributeRightMargin multiplier:1.0 constant:-10] + [progressView.topAnchor constraintEqualToAnchor:navigationBar.bottomAnchor], + [progressView.leadingAnchor constraintEqualToAnchor:navigationBar.safeAreaLayoutGuide.leadingAnchor constant:10], + [progressView.trailingAnchor constraintEqualToAnchor:navigationBar.safeAreaLayoutGuide.trailingAnchor constant:-10] ]]; } + + [self.view layoutIfNeeded]; + self.pageViewController.additionalSafeAreaInsets = UIEdgeInsetsMake(progressView.bounds.size.height, 0, 0, 0); } else { self.pageViewController.navigationItem.titleView = self.progressView; From 2439cde97f5a11f1d75b9056f3884c8981875e83 Mon Sep 17 00:00:00 2001 From: Eric Schramm Date: Wed, 2 Sep 2026 20:32:43 -0500 Subject: [PATCH 06/10] restore accessibility/testability for progressBar --- ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m index 9278799a1e..e5caec83e7 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m @@ -1069,8 +1069,13 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B - (void)configureProgressView { if (@available(iOS 26.0, *)) { self.pageViewController.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; - self.pageViewController.navigationItem.title = nil; - + self.pageViewController.navigationItem.titleView = [UIView new]; + + // for UITesting, we will add a title that will not display (suppressed by the empty + // titleView above), but should appear via accessibility + NSUInteger progressPercent = (NSUInteger)(self.progressView.progress * 100); + self.pageViewController.navigationItem.title = [NSString stringWithFormat:@"ProgressBar:%@", @(progressPercent)]; + CEVRK1NavigationBarProgressView *progressView = self.progressView; if (!progressView.superview) { UINavigationBar *navigationBar = self.childNavigationController.navigationBar; From abdc3d31e67a65c045a8b72f3dd70c5d75649856 Mon Sep 17 00:00:00 2001 From: Eric Schramm Date: Wed, 2 Sep 2026 20:50:51 -0500 Subject: [PATCH 07/10] fix tint issue on Done button on keyboard accessory --- ResearchKit/Common/ORKAnswerTextField.m | 14 ++++++++++++-- ResearchKit/Common/ORKAnswerTextView.m | 9 +++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/ResearchKit/Common/ORKAnswerTextField.m b/ResearchKit/Common/ORKAnswerTextField.m index ee1614dc0f..75cb2e25f4 100644 --- a/ResearchKit/Common/ORKAnswerTextField.m +++ b/ResearchKit/Common/ORKAnswerTextField.m @@ -35,7 +35,9 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE #import "ORKAccessibility.h" -@implementation ORKAnswerTextField +@implementation ORKAnswerTextField { + UIBarButtonItem *_doneButton; +} - (instancetype)init { self = [super init]; @@ -77,15 +79,23 @@ - (void)addAccessoryViewWithDoneButton { } else { [accessoryViewWithDoneButton setBarTintColor:ORKColor(ORKBackgroundColorKey)]; } - + accessoryViewWithDoneButton.items = @[flexibleSpace, doneButton]; self.inputAccessoryView = accessoryViewWithDoneButton; + _doneButton = doneButton; } - (void)keyboardAccessoryViewDoneButtonPressed { [self resignFirstResponder]; } +- (void)didMoveToWindow { + [super didMoveToWindow]; + if (@available(iOS 26.0, *)) { + _doneButton.tintColor = ORKViewTintColor(self); + } +} + - (void)updateAppearance { self.font = [[self class] defaultFont]; [self invalidateIntrinsicContentSize]; diff --git a/ResearchKit/Common/ORKAnswerTextView.m b/ResearchKit/Common/ORKAnswerTextView.m index 0ac365a9ce..f2e8a643a7 100644 --- a/ResearchKit/Common/ORKAnswerTextView.m +++ b/ResearchKit/Common/ORKAnswerTextView.m @@ -39,6 +39,7 @@ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE @implementation ORKAnswerTextView { UITextView *_placeholderTextView; NSArray *_accessibilityCustomActions; + UIBarButtonItem *_doneButton; } - (instancetype)init { @@ -96,12 +97,20 @@ - (void)addAccessoryViewWithDoneButton { accessoryViewWithDoneButton.items = @[flexibleSpace, doneButton]; self.inputAccessoryView = accessoryViewWithDoneButton; + _doneButton = doneButton; } - (void)keyboardAccessoryViewDoneButtonPressed { [self resignFirstResponder]; } +- (void)didMoveToWindow { + [super didMoveToWindow]; + if (@available(iOS 26.0, *)) { + _doneButton.tintColor = ORKViewTintColor(self); + } +} + - (void)layoutSubviews { [super layoutSubviews]; // Setting the frame directly causes a layout error on a form step (it looks like an iOS bug, as setting the frame should produce the same effect as setting the bounds and the center) From a585c976b072b2f8b44d8593b4f2cf5b0849fb4d Mon Sep 17 00:00:00 2001 From: Eric Schramm Date: Wed, 2 Sep 2026 22:11:50 -0500 Subject: [PATCH 08/10] really fix the offset for a few steps with progress bar --- .../ORK1ImageCaptureStepViewController.m | 20 +++++++++++++---- .../ORK1Kit/Common/ORK1TaskViewController.m | 10 +++++++-- .../ORK1VideoCaptureStepViewController.m | 20 +++++++++++++---- .../Common/ORK1WebViewStepViewController.m | 22 +++++++++++++++++-- 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/ORK1Kit/ORK1Kit/Common/ORK1ImageCaptureStepViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1ImageCaptureStepViewController.m index 292ce83d06..a89343097b 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1ImageCaptureStepViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1ImageCaptureStepViewController.m @@ -103,10 +103,22 @@ - (instancetype)initWithStep:(ORK1Step *)step { - (void)setUpConstraints { NSMutableArray *constraints = [NSMutableArray new]; NSDictionary *views = @{ @"imageCaptureView": _imageCaptureView }; - [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageCaptureView]|" - options:NSLayoutFormatDirectionLeadingToTrailing - metrics:nil - views:views]]; + // Top edge: on iOS 26+, pin to the safe area rather than the raw view edge, so this full-bleed + // view still reserves space for CEVRK1's navigation-bar progress view (added via + // additionalSafeAreaInsets in ORK1TaskViewController's configureProgressView) instead of + // rendering underneath it. Leading/trailing/bottom stay pinned to the raw edges (unchanged, + // still full-bleed there) — the nav bar is already opaque on iOS 26+ regardless of progress + // style (see ORK1TaskViewController commonInit), so this is a no-op except when the extra + // progress-bar inset is actually present. iOS <26 is left on the original raw-edge pin. + if (@available(iOS 26.0, *)) { + [constraints addObject:[_imageCaptureView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor]]; + } else { + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageCaptureView]" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + } + [constraints addObject:[_imageCaptureView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor]]; [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageCaptureView]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil diff --git a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m index e5caec83e7..1fbf71c51d 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m @@ -1077,8 +1077,8 @@ - (void)configureProgressView { self.pageViewController.navigationItem.title = [NSString stringWithFormat:@"ProgressBar:%@", @(progressPercent)]; CEVRK1NavigationBarProgressView *progressView = self.progressView; + UINavigationBar *navigationBar = self.childNavigationController.navigationBar; if (!progressView.superview) { - UINavigationBar *navigationBar = self.childNavigationController.navigationBar; navigationBar.opaque = YES; navigationBar.translucent = NO; @@ -1091,7 +1091,13 @@ - (void)configureProgressView { ]]; } - [self.view layoutIfNeeded]; + // Scoped to navigationBar rather than self.view: progressView's constraints are entirely + // self-contained within the nav bar subtree, and self.view's subtree also contains whatever + // step content view is currently presented. Forcing that to lay out early (before it's + // necessarily attached to a window, mid-transition) can trip pre-existing updateConstraints + // bugs in step views (e.g. ORK1ImageCaptureView) that assume they're only laid out once + // installed in a window. + [navigationBar layoutIfNeeded]; self.pageViewController.additionalSafeAreaInsets = UIEdgeInsetsMake(progressView.bounds.size.height, 0, 0, 0); } else { self.pageViewController.navigationItem.titleView = self.progressView; diff --git a/ORK1Kit/ORK1Kit/Common/ORK1VideoCaptureStepViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1VideoCaptureStepViewController.m index 86bf0855ab..4b93c2469a 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1VideoCaptureStepViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1VideoCaptureStepViewController.m @@ -83,10 +83,22 @@ - (void)setUpConstraints { NSDictionary *views = @{ @"videoCaptureView": _videoCaptureView }; _videoCaptureView.translatesAutoresizingMaskIntoConstraints = NO; - [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[videoCaptureView]|" - options:NSLayoutFormatDirectionLeadingToTrailing - metrics:nil - views:views]]; + // Top edge: on iOS 26+, pin to the safe area rather than the raw view edge, so this full-bleed + // view still reserves space for CEVRK1's navigation-bar progress view (added via + // additionalSafeAreaInsets in ORK1TaskViewController's configureProgressView) instead of + // rendering underneath it. Leading/trailing/bottom stay pinned to the raw edges (unchanged, + // still full-bleed there) — the nav bar is already opaque on iOS 26+ regardless of progress + // style (see ORK1TaskViewController commonInit), so this is a no-op except when the extra + // progress-bar inset is actually present. iOS <26 is left on the original raw-edge pin. + if (@available(iOS 26.0, *)) { + [constraints addObject:[_videoCaptureView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor]]; + } else { + [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[videoCaptureView]" + options:NSLayoutFormatDirectionLeadingToTrailing + metrics:nil + views:views]]; + } + [constraints addObject:[_videoCaptureView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor]]; [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[videoCaptureView]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil diff --git a/ORK1Kit/ORK1Kit/Common/ORK1WebViewStepViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1WebViewStepViewController.m index 1d996d3838..fffddfa556 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1WebViewStepViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1WebViewStepViewController.m @@ -154,9 +154,27 @@ - (ORK1StepResult *)result { - (void)viewDidLoad { [super viewDidLoad]; - _webView.frame = self.view.bounds; - _webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:_webView]; + _webView.translatesAutoresizingMaskIntoConstraints = NO; + + // Top edge: on iOS 26+, pin to the safe area rather than the raw view edge, so this full-bleed + // view still reserves space for CEVRK1's navigation-bar progress view (added via + // additionalSafeAreaInsets in ORK1TaskViewController's configureProgressView) instead of + // rendering underneath it. Leading/trailing/bottom stay pinned to the raw edges (unchanged, + // still full-bleed there) — the nav bar is already opaque on iOS 26+ regardless of progress + // style (see ORK1TaskViewController commonInit), so this is a no-op except when the extra + // progress-bar inset is actually present. iOS <26 is left on the original raw-edge pin + // (previously achieved via frame = self.view.bounds; now via an equivalent top anchor). + NSLayoutYAxisAnchor *topAnchor = self.view.topAnchor; + if (@available(iOS 26.0, *)) { + topAnchor = self.view.safeAreaLayoutGuide.topAnchor; + } + [NSLayoutConstraint activateConstraints:@[ + [_webView.topAnchor constraintEqualToAnchor:topAnchor], + [_webView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor], + [_webView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor], + [_webView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor], + ]]; } - (void)viewDidDisappear:(BOOL)animated { From 5628098990ead4f0592790ac75b8d6b6b163405d Mon Sep 17 00:00:00 2001 From: Mike Mertsock Date: Thu, 3 Sep 2026 09:05:11 -0400 Subject: [PATCH 09/10] PR fix adjustments --- ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m index 1fbf71c51d..5e7dd20b64 100644 --- a/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m +++ b/ORK1Kit/ORK1Kit/Common/ORK1TaskViewController.m @@ -1033,6 +1033,7 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B strongSelf.pageViewController.navigationItem.title = nil; strongSelf.progressView.hidden = YES; if (@available(iOS 26.0, *)) { + // Reset safe area insets that are adjusted when progress view is visible. strongSelf.pageViewController.additionalSafeAreaInsets = UIEdgeInsetsZero; } } else { @@ -1053,6 +1054,7 @@ - (void)showViewController:(ORK1StepViewController *)viewController goForward:(B strongSelf.pageViewController.navigationItem.title = [NSString localizedStringWithFormat:ORK1LocalizedString(@"STEP_PROGRESS_FORMAT", nil) ,ORK1LocalizedStringFromNumber(@(taskProgress.current)), ORK1LocalizedStringFromNumber(@(taskProgress.total))]; strongSelf.progressView.hidden = YES; if (@available(iOS 26.0, *)) { + // Reset safe area insets that are adjusted when progress view is visible. strongSelf.pageViewController.additionalSafeAreaInsets = UIEdgeInsetsZero; } } @@ -1071,10 +1073,14 @@ - (void)configureProgressView { self.pageViewController.navigationItem.largeTitleDisplayMode = UINavigationItemLargeTitleDisplayModeNever; self.pageViewController.navigationItem.titleView = [UIView new]; +#if DEBUG // for UITesting, we will add a title that will not display (suppressed by the empty // titleView above), but should appear via accessibility NSUInteger progressPercent = (NSUInteger)(self.progressView.progress * 100); self.pageViewController.navigationItem.title = [NSString stringWithFormat:@"ProgressBar:%@", @(progressPercent)]; +#else + self.pageViewController.navigationItem.title = nil; +#endif CEVRK1NavigationBarProgressView *progressView = self.progressView; UINavigationBar *navigationBar = self.childNavigationController.navigationBar; From 0629204ddd6a98bc7864242adb6bcdcbd0146ad8 Mon Sep 17 00:00:00 2001 From: Mike Mertsock Date: Thu, 3 Sep 2026 17:32:06 -0400 Subject: [PATCH 10/10] Update CI for Xcode 27 --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 29c998597e..cf2ea07a7e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,14 +6,14 @@ permissions: contents: read jobs: build: - runs-on: macos-26 + runs-on: xcode-27 env: - # https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md - xcode: '/Applications/Xcode_26.2.app' - destination_ios: 'platform=iOS Simulator,OS=26.2,name=iPhone 17' + # https://github.com/actions/runner-images/blob/main/images/macos/xcode-27-arm64-Readme.md + xcode: '/Applications/Xcode_27.0.app' + destination_ios: 'platform=iOS Simulator,OS=27.0,name=iPhone 17' steps: - name: Checkout - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: token: ${{ secrets.CAREEVOLUTIONBUILD_TOKEN }} submodules: 'recursive'