318 lines
9.5 KiB
Objective-C

//
// CLTextSettingView.m
//
// Created by sho yakushiji on 2013/12/18.
// Copyright (c) 2013年 CALACULU. All rights reserved.
//
#import "CLTextSettingView.h"
#import "UIView+Frame.h"
#import "CLImageEditorTheme.h"
#import "CLColorPickerView.h"
#import "CLFontPickerView.h"
#import "CLCircleView.h"
@interface CLTextSettingView()
<CLColorPickerViewDelegate, CLFontPickerViewDelegate, UITextViewDelegate>
@property (nonatomic, strong) UIView *selectedMode;
@end
@implementation CLTextSettingView
{
UIScrollView *_scrollView;
UITextView *_textView;
CLColorPickerView *_colorPickerView;
CLFontPickerView *_fontPickerView;
UIView *_colorPanel;
CLCircleView *_fillCircle;
CLCircleView *_pathCircle;
UISlider *_pathSlider;
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self customInit];
}
return self;
}
- (void)setColorPanel
{
_colorPickerView = [[CLColorPickerView alloc] initWithFrame:CGRectMake(0, 0, 0, 160)];
_colorPickerView.delegate = self;
_colorPickerView.center = CGPointMake(_colorPanel.width/2 - 10, _colorPickerView.height/2 - 5);
[_colorPanel addSubview:_colorPickerView];
_pathSlider = [[UISlider alloc] initWithFrame:CGRectMake(0, 0, _colorPickerView.width*0.8, 34)];
_pathSlider.center = CGPointMake(_colorPickerView.center.x, _colorPickerView.bottom + 5);
_pathSlider.minimumValue = 0;
_pathSlider.maximumValue = 1;
_pathSlider.value = 0;
[_pathSlider addTarget:self action:@selector(pathSliderDidChange:) forControlEvents:UIControlEventValueChanged];
[_colorPanel addSubview:_pathSlider];
_pathCircle = [[CLCircleView alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
_pathCircle.right = _colorPanel.width - 10;
_pathCircle.bottom = _pathSlider.center.y;
_pathCircle.radius = 0.6;
_pathCircle.borderWidth = 2;
_pathCircle.borderColor = [UIColor blackColor];
_pathCircle.color = [UIColor clearColor];
[_colorPanel addSubview:_pathCircle];
_fillCircle = [[CLCircleView alloc] initWithFrame:_pathCircle.frame];
_fillCircle.bottom = _pathCircle.top;
_fillCircle.radius = 0.6;
[_colorPanel addSubview:_fillCircle];
[_pathCircle addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(modeViewTapped:)]];
[_fillCircle addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(modeViewTapped:)]];
_fillCircle.tag = 0;
_pathCircle.tag = 1;
self.selectedMode = _fillCircle;
}
- (void)customInit
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardWillHide:) name:UIKeyboardWillHideNotification object:nil];
_scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
_scrollView.pagingEnabled = YES;
_scrollView.showsHorizontalScrollIndicator = NO;
_scrollView.showsVerticalScrollIndicator = NO;
_scrollView.scrollEnabled = NO;
[self addSubview:_scrollView];
_textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 0, self.width-42, 80)];
_textView.delegate = self;
_textView.backgroundColor = [UIColor clearColor];
[_scrollView addSubview:_textView];
_colorPanel = [[UIView alloc] initWithFrame:CGRectMake(self.width, 0, self.width, self.height)];
_colorPanel.backgroundColor = [UIColor clearColor];
[_scrollView addSubview:_colorPanel];
[self setColorPanel];
_fontPickerView = [[CLFontPickerView alloc] initWithFrame:CGRectMake(self.width * 2, 0, self.width, self.height)];
_fontPickerView.delegate = self;
_fontPickerView.sizeComponentHidden = YES;
[_scrollView addSubview:_fontPickerView];
_scrollView.contentSize = CGSizeMake(self.width * 3, self.height);
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)setTextColor:(UIColor*)textColor
{
_fontPickerView.textColor = textColor;
_textView.textColor = textColor;
}
- (BOOL)isFirstResponder
{
return _textView.isFirstResponder;
}
- (BOOL)becomeFirstResponder
{
return [_textView becomeFirstResponder];
}
- (BOOL)resignFirstResponder
{
return [_textView resignFirstResponder];
}
- (void)modeViewTapped:(UITapGestureRecognizer*)sender
{
self.selectedMode = sender.view;
}
#pragma mark - Properties
- (void)setSelectedMode:(UIView *)selectedMode
{
if(selectedMode != _selectedMode){
_selectedMode.backgroundColor = [UIColor clearColor];
_selectedMode = selectedMode;
_selectedMode.backgroundColor = [[CLImageEditorTheme theme] toolbarSelectedButtonColor];
if(_selectedMode==_fillCircle){
_colorPickerView.color = _fillCircle.color;
}
else{
_colorPickerView.color = _pathCircle.borderColor;
}
}
}
- (void)setSelectedText:(NSString *)selectedText
{
_textView.text = selectedText;
}
- (NSString*)selectedText
{
return _textView.text;
}
- (void)setSelectedFillColor:(UIColor *)selectedFillColor
{
_fillCircle.color = selectedFillColor;
if(self.selectedMode==_fillCircle){
_colorPickerView.color = _fillCircle.color;
}
}
- (UIColor*)selectedFillColor
{
return _fillCircle.color;
}
- (void)setSelectedBorderColor:(UIColor *)selectedBorderColor
{
_pathCircle.borderColor = selectedBorderColor;
if(self.selectedMode==_pathCircle){
_colorPickerView.color = _pathCircle.borderColor;
}
}
- (UIColor*)selectedBorderColor
{
return _pathCircle.borderColor;
}
- (void)setSelectedBorderWidth:(CGFloat)selectedBorderWidth
{
_pathSlider.value = selectedBorderWidth;
}
- (CGFloat)selectedBorderWidth
{
return _pathSlider.value;
}
- (void)setSelectedFont:(UIFont *)selectedFont
{
_fontPickerView.font = selectedFont;
}
- (UIFont*)selectedFont
{
return _fontPickerView.font;
}
- (void)setFontPickerForegroundColor:(UIColor*)foregroundColor
{
_fontPickerView.foregroundColor = foregroundColor;
}
- (void)showSettingMenuWithIndex:(NSInteger)index animated:(BOOL)animated
{
[_scrollView setContentOffset:CGPointMake(index * self.width, 0) animated:animated];
}
#pragma mark - keyboard events
- (void)keyBoardWillShow:(NSNotification *)notificatioin
{
[self keyBoardWillChange:notificatioin withTextViewHeight:80];
[_textView scrollRangeToVisible:_textView.selectedRange];
}
- (void)keyBoardWillHide:(NSNotification *)notificatioin
{
[self keyBoardWillChange:notificatioin withTextViewHeight:self.height - 20];
}
- (void)keyBoardWillChange:(NSNotification *)notificatioin withTextViewHeight:(CGFloat)height
{
CGRect keyboardFrame = [[notificatioin.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrame = [self.superview convertRect:keyboardFrame fromView:self.window];
UIViewAnimationCurve animationCurve = [[notificatioin.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
double duration = [[notificatioin.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionBeginFromCurrentState | (animationCurve<<16)
animations:^{
self->_textView.height = height;
CGFloat dy = MIN(0, (keyboardFrame.origin.y - self->_textView.height) - self.top);
self.transform = CGAffineTransformMakeTranslation(0, dy);
} completion:^(BOOL finished) {
}
];
}
#pragma mark- Color picker delegate
- (void)colorPickerView:(CLColorPickerView *)picker colorDidChange:(UIColor *)color
{
if(self.selectedMode==_fillCircle){
_fillCircle.color = color;
if([self.delegate respondsToSelector:@selector(textSettingView:didChangeFillColor:)]){
[self.delegate textSettingView:self didChangeFillColor:color];
}
}
else{
_pathCircle.borderColor = color;
if([self.delegate respondsToSelector:@selector(textSettingView:didChangeBorderColor:)]){
[self.delegate textSettingView:self didChangeBorderColor:color];
}
}
}
#pragma mark- PathSlider event
- (void)pathSliderDidChange:(UISlider*)sender
{
if([self.delegate respondsToSelector:@selector(textSettingView:didChangeBorderWidth:)]){
[self.delegate textSettingView:self didChangeBorderWidth:_pathSlider.value];
}
}
#pragma mark- Font picker delegate
- (void)fontPickerView:(CLFontPickerView *)pickerView didSelectFont:(UIFont *)font
{
if([self.delegate respondsToSelector:@selector(textSettingView:didChangeFont:)]){
[self.delegate textSettingView:self didChangeFont:font];
}
}
#pragma mark- UITextView delegate
- (void)textViewDidChange:(UITextView*)textView
{
NSRange selection = textView.selectedRange;
if(selection.location+selection.length == textView.text.length && [textView.text characterAtIndex:textView.text.length-1] == '\n') {
[textView layoutSubviews];
[textView scrollRectToVisible:CGRectMake(0, textView.contentSize.height - 1, 1, 1) animated:YES];
}
else {
[textView scrollRangeToVisible:textView.selectedRange];
}
if([self.delegate respondsToSelector:@selector(textSettingView:didChangeText:)]){
[self.delegate textSettingView:self didChangeText:textView.text];
}
}
@end