318 lines
9.5 KiB
Objective-C
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
|