You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
4.8 KiB
131 lines
4.8 KiB
//
|
|
// FLEXFieldEditorViewController.m
|
|
// Flipboard
|
|
//
|
|
// Created by Ryan Olson on 5/16/14.
|
|
// Copyright (c) 2014 Flipboard. All rights reserved.
|
|
//
|
|
|
|
#import "FLEXFieldEditorViewController.h"
|
|
#import "FLEXFieldEditorView.h"
|
|
#import "FLEXRuntimeUtility.h"
|
|
#import "FLEXUtility.h"
|
|
#import "FLEXObjectExplorerFactory.h"
|
|
#import "FLEXArgumentInputView.h"
|
|
#import "FLEXArgumentInputViewFactory.h"
|
|
#import "FLEXObjectExplorerViewController.h"
|
|
|
|
@interface FLEXFieldEditorViewController () <UIScrollViewDelegate>
|
|
|
|
@property (nonatomic, strong) UIScrollView *scrollView;
|
|
|
|
@property (nonatomic, strong, readwrite) id target;
|
|
@property (nonatomic, strong, readwrite) FLEXFieldEditorView *fieldEditorView;
|
|
@property (nonatomic, strong, readwrite) UIBarButtonItem *setterButton;
|
|
|
|
@end
|
|
|
|
@implementation FLEXFieldEditorViewController
|
|
|
|
- (id)initWithTarget:(id)target
|
|
{
|
|
self = [super initWithNibName:nil bundle:nil];
|
|
if (self) {
|
|
self.target = target;
|
|
[[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];
|
|
}
|
|
|
|
- (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 = [FLEXUtility scrollViewGrayColor];
|
|
|
|
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];
|
|
|
|
self.fieldEditorView = [[FLEXFieldEditorView alloc] init];
|
|
self.fieldEditorView.backgroundColor = self.view.backgroundColor;
|
|
self.fieldEditorView.targetDescription = [NSString stringWithFormat:@"%@ %p", [self.target class], self.target];
|
|
[self.scrollView addSubview:self.fieldEditorView];
|
|
|
|
self.setterButton = [[UIBarButtonItem alloc] initWithTitle:[self titleForActionButton] style:UIBarButtonItemStyleDone target:self action:@selector(actionButtonPressed:)];
|
|
self.navigationItem.rightBarButtonItem = self.setterButton;
|
|
}
|
|
|
|
- (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;
|
|
}
|
|
|
|
- (FLEXArgumentInputView *)firstInputView
|
|
{
|
|
return [[self.fieldEditorView argumentInputViews] firstObject];
|
|
}
|
|
|
|
- (void)actionButtonPressed:(id)sender
|
|
{
|
|
// Subclasses can override
|
|
[self.fieldEditorView endEditing:YES];
|
|
}
|
|
|
|
- (NSString *)titleForActionButton
|
|
{
|
|
// Subclasses can override.
|
|
return @"Set";
|
|
}
|
|
|
|
- (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
|