visionOS: make keyboard resizable ±25%
This commit is contained in:
parent
7a93412c3f
commit
043c20b645
|
@ -16,19 +16,22 @@
|
|||
#define KC_CONTROL 59
|
||||
|
||||
@implementation KBKeyboardView {
|
||||
NSMutableArray *keyPlanes;
|
||||
NSMutableArray *keyPlanes, *emptyKeyPlanes;
|
||||
NSMutableSet *modifiers;
|
||||
NSMutableIndexSet *keysDown;
|
||||
CGAffineTransform defaultKeyTransform;
|
||||
CGFloat fontSize;
|
||||
CGSize selectedSize;
|
||||
UIEdgeInsets safeAreaInsets;
|
||||
CGSize intrinsicSize;
|
||||
}
|
||||
|
||||
- (instancetype)initWithFrame:(CGRect)frame safeAreaInsets:(UIEdgeInsets)insets {
|
||||
self = [super initWithFrame:frame];
|
||||
if (self) {
|
||||
safeAreaInsets = insets;
|
||||
intrinsicSize = frame.size;
|
||||
#if !defined(TARGET_OS_VISION) || TARGET_OS_VISION == 0
|
||||
if (@available(iOS 13.0, *)) {
|
||||
self.backgroundColor = [UIColor clearColor];
|
||||
UIVisualEffectView *backgroundView = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleSystemThickMaterial]];
|
||||
|
@ -37,8 +40,10 @@
|
|||
} else {
|
||||
self.backgroundColor = [UIColor colorWithRed:0xEB / 255.0 green:0xF0 / 255.0 blue:0xF7 / 255.0 alpha:0.9];
|
||||
}
|
||||
#endif
|
||||
modifiers = [NSMutableSet setWithCapacity:4];
|
||||
keysDown = [NSMutableIndexSet indexSet];
|
||||
self.autoresizesSubviews = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
@ -47,10 +52,29 @@
|
|||
return [self initWithFrame:frame safeAreaInsets:UIEdgeInsetsZero];
|
||||
}
|
||||
|
||||
- (CGSize)intrinsicContentSize {
|
||||
return intrinsicSize;
|
||||
}
|
||||
|
||||
- (BOOL)isCompactKeyboardSize:(CGSize)size {
|
||||
return size.width < 768.0;
|
||||
}
|
||||
|
||||
#if defined(TARGET_OS_VISION) && TARGET_OS_VISION == 1
|
||||
- (void)layoutSubviews {
|
||||
// TODO: optimize this if needed
|
||||
CGSize size = self.bounds.size;
|
||||
CGFloat scale = size.width / intrinsicSize.width;
|
||||
CGAffineTransform transform = CGAffineTransformMakeScale(scale, scale);
|
||||
if (!CGAffineTransformEqualToTransform(transform, defaultKeyTransform)) {
|
||||
defaultKeyTransform = transform;
|
||||
keyPlanes = emptyKeyPlanes.mutableCopy;
|
||||
fontSize = 30.0 * scale;
|
||||
[self switchToKeyPlane:0];
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
- (CGSize)findBestSizeForWidth:(CGFloat)preferredWidth inArray:(NSArray<NSValue*>*)sizes {
|
||||
CGSize selectedSize = CGSizeZero;
|
||||
for (NSValue *key in sizes) {
|
||||
|
@ -116,7 +140,8 @@
|
|||
for (int i = 0; i < numberOfKeyPlanes; i++) {
|
||||
[keyPlanes addObject:[NSNull null]];
|
||||
}
|
||||
|
||||
emptyKeyPlanes = keyPlanes.mutableCopy;
|
||||
|
||||
[self switchToKeyPlane:0];
|
||||
}
|
||||
|
||||
|
|
|
@ -19,9 +19,17 @@ class KeyboardSceneDelegate: UIResponder, UIWindowSceneDelegate {
|
|||
fatalError("No main view controller")
|
||||
}
|
||||
|
||||
let size = mainViewController.keyboardViewController.preferredContentSize
|
||||
windowScene.sizeRestrictions?.minimumSize = size
|
||||
windowScene.sizeRestrictions?.maximumSize = size
|
||||
let defaultSize = mainViewController.keyboardViewController.preferredContentSize
|
||||
let minSize = defaultSize.applying(.init(scaleX: 0.75, y: 0.75))
|
||||
let maxSize = defaultSize.applying(.init(scaleX: 1.25, y: 1.25))
|
||||
windowScene.sizeRestrictions?.minimumSize = minSize
|
||||
windowScene.sizeRestrictions?.maximumSize = maxSize
|
||||
windowScene.requestGeometryUpdate(UIWindowScene.GeometryPreferences.Vision(
|
||||
size: defaultSize,
|
||||
minimumSize: minSize,
|
||||
maximumSize: maxSize,
|
||||
resizingRestrictions: .uniform
|
||||
))
|
||||
window = UIWindow(windowScene: windowScene)
|
||||
|
||||
if let window {
|
||||
|
|
Loading…
Reference in New Issue