i just solved using a new class
#import <UIKit/UIKit.h>
@interface ZoomScrollViewController : UIViewController <UIScrollViewDelegate>
@property (nonatomic, strong) UIScrollView *zoomScrollView;
@end
#import "ZoomScrollViewController.h"
#import <sys/utsname.h>
@implementation ZoomScrollViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Disabilita gli inset automatici su iOS 11+
if (@available(iOS 11.0, *)) {
self.zoomScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
// Se stai usando Interface Builder, collega la scrollView via outlet.
// Altrimenti:
UIView *orig = self.view;
UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:orig.frame];
scroll.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
scroll.delegate = self;
scroll.backgroundColor = [UIColor blackColor];
self.zoomScrollView = scroll;
[scroll addSubview:orig];
self.view = scroll;
// Assicurati che lo scrollView non si veda “bianco” dove non c'è contenuto
self.zoomScrollView.backgroundColor = self.view.backgroundColor;
// Disabilita inset automatici su iOS 11+
if (@available(iOS 11.0, *)) {
self.zoomScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
self.automaticallyAdjustsScrollViewInsets = NO;
}
}
// Helper per recuperare l’identificativo del device
- (NSString*)deviceModelIdentifier {
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
UIView *content = self.zoomScrollView.subviews.firstObject;
if (!content) return;
// 1) Reset
content.transform = CGAffineTransformIdentity;
content.frame = CGRectMake(0, 0, 1024, 768);
// 2) Dimensioni container
CGSize cSize = self.zoomScrollView.bounds.size;
CGFloat scaleX = cSize.width / 1024.0;
CGFloat scaleY = cSize.height / 768.0;
// 3) Controllo dispositivo
NSString *modelID = [self deviceModelIdentifier];
NSLog(@"🔖 Device model: %@", modelID);
NSLog(@"scaleX: %.3f, scaleY: %.3f", scaleX, scaleY);
BOOL isiPadMiniOrA16 = NO;
if ([modelID hasPrefix:@"iPad14,1"] ||
[modelID hasPrefix:@"iPad14,2"] ||
[modelID hasPrefix:@"iPad14,6"] ||
[modelID hasPrefix:@"iPad14,7"] ||
[modelID hasPrefix:@"iPad15,7"]) {
isiPadMiniOrA16 = YES;
}
if (isiPadMiniOrA16) {
scaleX = 1.152;
// puoi mantenere scaleY come calcolato sopra, oppure settarlo fisso se necessario
}
NSLog(@"scaleX: %.3f, scaleY: %.3f", scaleX, scaleY);
// 4) Applica trasformazione (stretch X)
content.transform = CGAffineTransformMakeScale(scaleX, scaleY);
// 4b) Centra il contenuto trasformato nella scrollView
CGSize scaledSize = CGSizeMake(1024 * scaleX, 768 * scaleY);
self.zoomScrollView.contentSize = scaledSize;
CGFloat offsetX = (self.zoomScrollView.bounds.size.width - scaledSize.width) / 2.0;
CGFloat offsetY = (self.zoomScrollView.bounds.size.height - scaledSize.height) / 2.0;
// Assicura che gli offset siano >= 0
offsetX = MAX(0, offsetX);
offsetY = MAX(0, offsetY);
// Posiziona il contenuto al centro
content.center = CGPointMake(scaledSize.width / 2.0 + offsetX,
scaledSize.height / 2.0 + offsetY);
// 5) Calcola nuova size del contenuto trasformato
self.zoomScrollView.contentSize = scaledSize;
// 6) Centra orizzontalmente solo se necessario
CGFloat xOff = (scaledSize.width - cSize.width) / 2.0;
[self.zoomScrollView setContentOffset:CGPointMake(xOff, 0) animated:NO];
// 7) Disattiva lo zoom dinamico della scrollView
self.zoomScrollView.minimumZoomScale = 1.0;
self.zoomScrollView.maximumZoomScale = 1.0;
self.zoomScrollView.zoomScale = 1.0;
}
@end
code-block
with this tricks works in ios18.5 and 26