mirror of
https://github.com/SoPat712/YTLitePlus.git
synced 2025-08-24 11:28:52 -04:00
142 lines
5.1 KiB
Objective-C
142 lines
5.1 KiB
Objective-C
//
|
|
// FLEXVariableEditorViewController.m
|
|
// Flipboard
|
|
//
|
|
// Created by Ryan Olson on 5/16/14.
|
|
// Copyright (c) 2020 FLEX Team. All rights reserved.
|
|
//
|
|
|
|
#import "FLEXColor.h"
|
|
#import "FLEXVariableEditorViewController.h"
|
|
#import "FLEXFieldEditorView.h"
|
|
#import "FLEXRuntimeUtility.h"
|
|
#import "FLEXUtility.h"
|
|
#import "FLEXObjectExplorerFactory.h"
|
|
#import "FLEXArgumentInputView.h"
|
|
#import "FLEXArgumentInputViewFactory.h"
|
|
#import "FLEXObjectExplorerViewController.h"
|
|
#import "UIBarButtonItem+FLEX.h"
|
|
|
|
@interface FLEXVariableEditorViewController () <UIScrollViewDelegate>
|
|
@property (nonatomic) UIScrollView *scrollView;
|
|
@end
|
|
|
|
@implementation FLEXVariableEditorViewController
|
|
|
|
#pragma mark - Initialization
|
|
|
|
+ (instancetype)target:(id)target data:(nullable id)data commitHandler:(void(^_Nullable)(void))onCommit {
|
|
return [[self alloc] initWithTarget:target data:data commitHandler:onCommit];
|
|
}
|
|
|
|
- (id)initWithTarget:(id)target data:(nullable id)data commitHandler:(void(^_Nullable)(void))onCommit {
|
|
self = [super init];
|
|
if (self) {
|
|
_target = target;
|
|
_data = data;
|
|
_commitHandler = onCommit;
|
|
[NSNotificationCenter.defaultCenter
|
|
addObserver:self selector:@selector(keyboardDidShow:)
|
|
name:UIKeyboardDidShowNotification object:nil
|
|
];
|
|
[NSNotificationCenter.defaultCenter
|
|
addObserver:self selector:@selector(keyboardWillHide:)
|
|
name:UIKeyboardWillHideNotification object:nil
|
|
];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc {
|
|
[NSNotificationCenter.defaultCenter removeObserver:self];
|
|
}
|
|
|
|
#pragma mark - UIViewController methods
|
|
|
|
- (void)keyboardDidShow:(NSNotification *)notification {
|
|
CGRect keyboardRectInWindow = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
|
|
CGSize keyboardSize = [self.view convertRect:keyboardRectInWindow fromView:nil].size;
|
|
UIEdgeInsets scrollInsets = self.scrollView.contentInset;
|
|
scrollInsets.bottom = keyboardSize.height;
|
|
self.scrollView.contentInset = scrollInsets;
|
|
self.scrollView.scrollIndicatorInsets = scrollInsets;
|
|
|
|
// Find the active input view and scroll to make sure it's visible.
|
|
for (FLEXArgumentInputView *argumentInputView in self.fieldEditorView.argumentInputViews) {
|
|
if (argumentInputView.inputViewIsFirstResponder) {
|
|
CGRect scrollToVisibleRect = [self.scrollView convertRect:argumentInputView.bounds fromView:argumentInputView];
|
|
[self.scrollView scrollRectToVisible:scrollToVisibleRect animated:YES];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)keyboardWillHide:(NSNotification *)notification {
|
|
UIEdgeInsets scrollInsets = self.scrollView.contentInset;
|
|
scrollInsets.bottom = 0.0;
|
|
self.scrollView.contentInset = scrollInsets;
|
|
self.scrollView.scrollIndicatorInsets = scrollInsets;
|
|
}
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
|
|
self.view.backgroundColor = FLEXColor.scrollViewBackgroundColor;
|
|
|
|
self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
|
|
self.scrollView.backgroundColor = self.view.backgroundColor;
|
|
self.scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
|
self.scrollView.delegate = self;
|
|
[self.view addSubview:self.scrollView];
|
|
|
|
_fieldEditorView = [FLEXFieldEditorView new];
|
|
self.fieldEditorView.targetDescription = [NSString stringWithFormat:@"%@ %p", [self.target class], self.target];
|
|
[self.scrollView addSubview:self.fieldEditorView];
|
|
|
|
_actionButton = [[UIBarButtonItem alloc]
|
|
initWithTitle:@"Set"
|
|
style:UIBarButtonItemStyleDone
|
|
target:self
|
|
action:@selector(actionButtonPressed:)
|
|
];
|
|
|
|
self.navigationController.toolbarHidden = NO;
|
|
self.toolbarItems = @[UIBarButtonItem.flex_flexibleSpace, self.actionButton];
|
|
}
|
|
|
|
- (void)viewWillLayoutSubviews {
|
|
CGSize constrainSize = CGSizeMake(self.scrollView.bounds.size.width, CGFLOAT_MAX);
|
|
CGSize fieldEditorSize = [self.fieldEditorView sizeThatFits:constrainSize];
|
|
self.fieldEditorView.frame = CGRectMake(0, 0, fieldEditorSize.width, fieldEditorSize.height);
|
|
self.scrollView.contentSize = fieldEditorSize;
|
|
}
|
|
|
|
#pragma mark - Public
|
|
|
|
- (FLEXArgumentInputView *)firstInputView {
|
|
return [self.fieldEditorView argumentInputViews].firstObject;
|
|
}
|
|
|
|
- (void)actionButtonPressed:(id)sender {
|
|
// Subclasses can override
|
|
[self.fieldEditorView endEditing:YES];
|
|
if (_commitHandler) {
|
|
_commitHandler();
|
|
}
|
|
}
|
|
|
|
- (void)exploreObjectOrPopViewController:(id)objectOrNil {
|
|
if (objectOrNil) {
|
|
// For non-nil (or void) return types, push an explorer view controller to display the object
|
|
FLEXObjectExplorerViewController *explorerViewController = [FLEXObjectExplorerFactory explorerViewControllerForObject:objectOrNil];
|
|
[self.navigationController pushViewController:explorerViewController animated:YES];
|
|
} else {
|
|
// If we didn't get a returned object but the method call succeeded,
|
|
// pop this view controller off the stack to indicate that the call went through.
|
|
[self.navigationController popViewControllerAnimated:YES];
|
|
}
|
|
}
|
|
|
|
@end
|