mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-29 07:42:40 +00:00
Do not embed external codes in the project. CocoaPods is our friend for that.
This commit is contained in:
parent
9f4ee183c4
commit
fbb60ee651
5 changed files with 0 additions and 992 deletions
|
@ -7,8 +7,6 @@
|
|||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
710210691A665F7300364868 /* HPGrowingTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 710210661A665F7300364868 /* HPGrowingTextView.m */; };
|
||||
7102106A1A665F7300364868 /* HPTextViewInternal.m in Sources */ = {isa = PBXBuildFile; fileRef = 710210681A665F7300364868 /* HPTextViewInternal.m */; };
|
||||
71D2E4EC1A49814B000DE015 /* MemberActionsCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 71D2E4EB1A49814B000DE015 /* MemberActionsCell.m */; };
|
||||
71DB9DC11A495B6400504A09 /* MemberViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 71DB9DC01A495B6400504A09 /* MemberViewController.m */; };
|
||||
71E94A771A5C4020009F52E5 /* PieChartView.m in Sources */ = {isa = PBXBuildFile; fileRef = 71E94A761A5C4020009F52E5 /* PieChartView.m */; };
|
||||
|
@ -71,10 +69,6 @@
|
|||
|
||||
/* Begin PBXFileReference section */
|
||||
13057A57E74FD5504196F47F /* Pods-matrixConsole.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-matrixConsole.release.xcconfig"; path = "Pods/Target Support Files/Pods-matrixConsole/Pods-matrixConsole.release.xcconfig"; sourceTree = "<group>"; };
|
||||
710210651A665F7300364868 /* HPGrowingTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HPGrowingTextView.h; path = External/GrowingTextView/class/HPGrowingTextView.h; sourceTree = "<group>"; };
|
||||
710210661A665F7300364868 /* HPGrowingTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HPGrowingTextView.m; path = External/GrowingTextView/class/HPGrowingTextView.m; sourceTree = "<group>"; };
|
||||
710210671A665F7300364868 /* HPTextViewInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HPTextViewInternal.h; path = External/GrowingTextView/class/HPTextViewInternal.h; sourceTree = "<group>"; };
|
||||
710210681A665F7300364868 /* HPTextViewInternal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HPTextViewInternal.m; path = External/GrowingTextView/class/HPTextViewInternal.m; sourceTree = "<group>"; };
|
||||
71D2E4EA1A49814B000DE015 /* MemberActionsCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemberActionsCell.h; sourceTree = "<group>"; };
|
||||
71D2E4EB1A49814B000DE015 /* MemberActionsCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MemberActionsCell.m; sourceTree = "<group>"; };
|
||||
71DB9DBF1A495B6400504A09 /* MemberViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemberViewController.h; sourceTree = "<group>"; };
|
||||
|
@ -176,34 +170,6 @@
|
|||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
710210631A665F4E00364868 /* External */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
710210641A665F5C00364868 /* GrowingTextView */,
|
||||
);
|
||||
name = External;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
710210641A665F5C00364868 /* GrowingTextView */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7102106B1A665FDD00364868 /* GrowingTextView */,
|
||||
710210651A665F7300364868 /* HPGrowingTextView.h */,
|
||||
710210661A665F7300364868 /* HPGrowingTextView.m */,
|
||||
710210671A665F7300364868 /* HPTextViewInternal.h */,
|
||||
710210681A665F7300364868 /* HPTextViewInternal.m */,
|
||||
);
|
||||
name = GrowingTextView;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7102106B1A665FDD00364868 /* GrowingTextView */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
);
|
||||
name = GrowingTextView;
|
||||
path = External/GrowingTextView;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
B18A10A9FB884DD357EBD414 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
|
@ -336,7 +302,6 @@
|
|||
F07A80D419DD9DE700B621A1 /* matrixConsole */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
710210631A665F4E00364868 /* External */,
|
||||
F021FBEC1A5EF57300EA3AE6 /* API */,
|
||||
F0465AF71A251F85003639F9 /* Model */,
|
||||
F03EF5FC19F1762000A0EE52 /* View */,
|
||||
|
@ -555,13 +520,11 @@
|
|||
71E94A771A5C4020009F52E5 /* PieChartView.m in Sources */,
|
||||
F0465AFA1A251F85003639F9 /* RoomMessage.m in Sources */,
|
||||
F021FBF21A5F1F8E00EA3AE6 /* MediaManager.m in Sources */,
|
||||
7102106A1A665F7300364868 /* HPTextViewInternal.m in Sources */,
|
||||
F04EE51F1A3A01D500C64930 /* APNSHandler.m in Sources */,
|
||||
F03C47111A02952800E445AB /* CustomAlert.m in Sources */,
|
||||
F0E84D401A1F9AEC005F2E42 /* RecentsTableViewCell.m in Sources */,
|
||||
F02D707619F1DC9E007B47D3 /* RoomMemberTableCell.m in Sources */,
|
||||
F00B5DB91A1B9BCE00EA1C8D /* CustomImageView.m in Sources */,
|
||||
710210691A665F7300364868 /* HPGrowingTextView.m in Sources */,
|
||||
F0D3C30C1A011EF10000D49E /* AppSettings.m in Sources */,
|
||||
F03EF5F719F171EB00A0EE52 /* LoginViewController.m in Sources */,
|
||||
F0D3C30F1A01330F0000D49E /* SettingsTableViewCell.m in Sources */,
|
||||
|
|
|
@ -1,126 +0,0 @@
|
|||
//
|
||||
// HPTextView.h
|
||||
//
|
||||
// Created by Hans Pinckaers on 29-06-10.
|
||||
//
|
||||
// MIT License
|
||||
//
|
||||
// Copyright (c) 2011 Hans Pinckaers
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000
|
||||
// UITextAlignment is deprecated in iOS 6.0+, use NSTextAlignment instead.
|
||||
// Reference: https://developer.apple.com/library/ios/documentation/uikit/reference/NSString_UIKit_Additions/Reference/Reference.html
|
||||
#define NSTextAlignment UITextAlignment
|
||||
#endif
|
||||
|
||||
@class HPGrowingTextView;
|
||||
@class HPTextViewInternal;
|
||||
|
||||
@protocol HPGrowingTextViewDelegate
|
||||
|
||||
@optional
|
||||
- (BOOL)growingTextViewShouldBeginEditing:(HPGrowingTextView *)growingTextView;
|
||||
- (BOOL)growingTextViewShouldEndEditing:(HPGrowingTextView *)growingTextView;
|
||||
|
||||
- (void)growingTextViewDidBeginEditing:(HPGrowingTextView *)growingTextView;
|
||||
- (void)growingTextViewDidEndEditing:(HPGrowingTextView *)growingTextView;
|
||||
|
||||
- (BOOL)growingTextView:(HPGrowingTextView *)growingTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text;
|
||||
- (void)growingTextViewDidChange:(HPGrowingTextView *)growingTextView;
|
||||
|
||||
- (void)growingTextView:(HPGrowingTextView *)growingTextView willChangeHeight:(float)height;
|
||||
- (void)growingTextView:(HPGrowingTextView *)growingTextView didChangeHeight:(float)height;
|
||||
|
||||
- (void)growingTextViewDidChangeSelection:(HPGrowingTextView *)growingTextView;
|
||||
- (BOOL)growingTextViewShouldReturn:(HPGrowingTextView *)growingTextView;
|
||||
@end
|
||||
|
||||
@interface HPGrowingTextView : UIView <UITextViewDelegate> {
|
||||
HPTextViewInternal *internalTextView;
|
||||
|
||||
int minHeight;
|
||||
int maxHeight;
|
||||
|
||||
//class properties
|
||||
int maxNumberOfLines;
|
||||
int minNumberOfLines;
|
||||
|
||||
BOOL animateHeightChange;
|
||||
NSTimeInterval animationDuration;
|
||||
|
||||
//uitextview properties
|
||||
NSObject <HPGrowingTextViewDelegate> *__unsafe_unretained delegate;
|
||||
NSTextAlignment textAlignment;
|
||||
NSRange selectedRange;
|
||||
BOOL editable;
|
||||
UIDataDetectorTypes dataDetectorTypes;
|
||||
UIReturnKeyType returnKeyType;
|
||||
UIKeyboardType keyboardType;
|
||||
|
||||
UIEdgeInsets contentInset;
|
||||
}
|
||||
|
||||
//real class properties
|
||||
@property int maxNumberOfLines;
|
||||
@property int minNumberOfLines;
|
||||
@property (nonatomic) int maxHeight;
|
||||
@property (nonatomic) int minHeight;
|
||||
@property BOOL animateHeightChange;
|
||||
@property NSTimeInterval animationDuration;
|
||||
@property (nonatomic, strong) NSString *placeholder;
|
||||
@property (nonatomic, strong) UIColor *placeholderColor;
|
||||
@property (nonatomic, strong) UITextView *internalTextView;
|
||||
|
||||
|
||||
//uitextview properties
|
||||
@property(unsafe_unretained) NSObject<HPGrowingTextViewDelegate> *delegate;
|
||||
@property(nonatomic,strong) NSString *text;
|
||||
@property(nonatomic,strong) UIFont *font;
|
||||
@property(nonatomic,strong) UIColor *textColor;
|
||||
@property(nonatomic) NSTextAlignment textAlignment; // default is NSTextAlignmentLeft
|
||||
@property(nonatomic) NSRange selectedRange; // only ranges of length 0 are supported
|
||||
@property(nonatomic,getter=isEditable) BOOL editable;
|
||||
@property(nonatomic) UIDataDetectorTypes dataDetectorTypes __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_0);
|
||||
@property (nonatomic) UIReturnKeyType returnKeyType;
|
||||
@property (nonatomic) UIKeyboardType keyboardType;
|
||||
@property (assign) UIEdgeInsets contentInset;
|
||||
@property (nonatomic) BOOL isScrollable;
|
||||
@property(nonatomic) BOOL enablesReturnKeyAutomatically;
|
||||
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000
|
||||
- (id)initWithFrame:(CGRect)frame textContainer:(NSTextContainer *)textContainer;
|
||||
#endif
|
||||
|
||||
//uitextview methods
|
||||
//need others? use .internalTextView
|
||||
- (BOOL)becomeFirstResponder;
|
||||
- (BOOL)resignFirstResponder;
|
||||
- (BOOL)isFirstResponder;
|
||||
|
||||
- (BOOL)hasText;
|
||||
- (void)scrollRangeToVisible:(NSRange)range;
|
||||
|
||||
// call to force a height change (e.g. after you change max/min lines)
|
||||
- (void)refreshHeight;
|
||||
|
||||
@end
|
|
@ -1,666 +0,0 @@
|
|||
//
|
||||
// HPTextView.m
|
||||
//
|
||||
// Created by Hans Pinckaers on 29-06-10.
|
||||
//
|
||||
// MIT License
|
||||
//
|
||||
// Copyright (c) 2011 Hans Pinckaers
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#import "HPGrowingTextView.h"
|
||||
#import "HPTextViewInternal.h"
|
||||
|
||||
@interface HPGrowingTextView(private)
|
||||
-(void)commonInitialiser;
|
||||
-(void)resizeTextView:(NSInteger)newSizeH;
|
||||
-(void)growDidStop;
|
||||
@end
|
||||
|
||||
@implementation HPGrowingTextView
|
||||
@synthesize internalTextView;
|
||||
@synthesize delegate;
|
||||
@synthesize maxHeight;
|
||||
@synthesize minHeight;
|
||||
@synthesize font;
|
||||
@synthesize textColor;
|
||||
@synthesize textAlignment;
|
||||
@synthesize selectedRange;
|
||||
@synthesize editable;
|
||||
@synthesize dataDetectorTypes;
|
||||
@synthesize animateHeightChange;
|
||||
@synthesize animationDuration;
|
||||
@synthesize returnKeyType;
|
||||
@dynamic placeholder;
|
||||
@dynamic placeholderColor;
|
||||
|
||||
// having initwithcoder allows us to use HPGrowingTextView in a Nib. -- aob, 9/2011
|
||||
- (id)initWithCoder:(NSCoder *)aDecoder
|
||||
{
|
||||
if ((self = [super initWithCoder:aDecoder])) {
|
||||
[self commonInitialiser];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame {
|
||||
if ((self = [super initWithFrame:frame])) {
|
||||
[self commonInitialiser];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000
|
||||
- (id)initWithFrame:(CGRect)frame textContainer:(NSTextContainer *)textContainer {
|
||||
if ((self = [super initWithFrame:frame])) {
|
||||
[self commonInitialiser:textContainer];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
-(void)commonInitialiser {
|
||||
[self commonInitialiser:nil];
|
||||
}
|
||||
|
||||
-(void)commonInitialiser:(NSTextContainer *)textContainer
|
||||
#else
|
||||
-(void)commonInitialiser
|
||||
#endif
|
||||
{
|
||||
// Initialization code
|
||||
CGRect r = self.frame;
|
||||
r.origin.y = 0;
|
||||
r.origin.x = 0;
|
||||
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 70000
|
||||
internalTextView = [[HPTextViewInternal alloc] initWithFrame:r textContainer:textContainer];
|
||||
#else
|
||||
internalTextView = [[HPTextViewInternal alloc] initWithFrame:r];
|
||||
#endif
|
||||
internalTextView.delegate = self;
|
||||
internalTextView.scrollEnabled = NO;
|
||||
internalTextView.font = [UIFont fontWithName:@"Helvetica" size:13];
|
||||
internalTextView.contentInset = UIEdgeInsetsZero;
|
||||
internalTextView.showsHorizontalScrollIndicator = NO;
|
||||
internalTextView.text = @"-";
|
||||
internalTextView.contentMode = UIViewContentModeRedraw;
|
||||
[self addSubview:internalTextView];
|
||||
|
||||
minHeight = internalTextView.frame.size.height;
|
||||
minNumberOfLines = 1;
|
||||
|
||||
animateHeightChange = YES;
|
||||
animationDuration = 0.1f;
|
||||
|
||||
internalTextView.text = @"";
|
||||
|
||||
[self setMaxNumberOfLines:3];
|
||||
|
||||
[self setPlaceholderColor:[UIColor lightGrayColor]];
|
||||
internalTextView.displayPlaceHolder = YES;
|
||||
}
|
||||
|
||||
-(CGSize)sizeThatFits:(CGSize)size
|
||||
{
|
||||
if (self.text.length == 0) {
|
||||
size.height = minHeight;
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
||||
-(void)layoutSubviews
|
||||
{
|
||||
[super layoutSubviews];
|
||||
|
||||
CGRect r = self.bounds;
|
||||
r.origin.y = 0;
|
||||
r.origin.x = contentInset.left;
|
||||
r.size.width -= contentInset.left + contentInset.right;
|
||||
|
||||
internalTextView.frame = r;
|
||||
}
|
||||
|
||||
-(void)setContentInset:(UIEdgeInsets)inset
|
||||
{
|
||||
contentInset = inset;
|
||||
|
||||
CGRect r = self.frame;
|
||||
r.origin.y = inset.top - inset.bottom;
|
||||
r.origin.x = inset.left;
|
||||
r.size.width -= inset.left + inset.right;
|
||||
|
||||
internalTextView.frame = r;
|
||||
|
||||
[self setMaxNumberOfLines:maxNumberOfLines];
|
||||
[self setMinNumberOfLines:minNumberOfLines];
|
||||
}
|
||||
|
||||
-(UIEdgeInsets)contentInset
|
||||
{
|
||||
return contentInset;
|
||||
}
|
||||
|
||||
-(void)setMaxNumberOfLines:(int)n
|
||||
{
|
||||
if(n == 0 && maxHeight > 0) return; // the user specified a maxHeight themselves.
|
||||
|
||||
// Use internalTextView for height calculations, thanks to Gwynne <http://blog.darkrainfall.org/>
|
||||
NSString *saveText = internalTextView.text, *newText = @"-";
|
||||
|
||||
internalTextView.delegate = nil;
|
||||
internalTextView.hidden = YES;
|
||||
|
||||
for (int i = 1; i < n; ++i)
|
||||
newText = [newText stringByAppendingString:@"\n|W|"];
|
||||
|
||||
internalTextView.text = newText;
|
||||
|
||||
maxHeight = [self measureHeight];
|
||||
|
||||
internalTextView.text = saveText;
|
||||
internalTextView.hidden = NO;
|
||||
internalTextView.delegate = self;
|
||||
|
||||
[self sizeToFit];
|
||||
|
||||
maxNumberOfLines = n;
|
||||
}
|
||||
|
||||
-(int)maxNumberOfLines
|
||||
{
|
||||
return maxNumberOfLines;
|
||||
}
|
||||
|
||||
- (void)setMaxHeight:(int)height
|
||||
{
|
||||
maxHeight = height;
|
||||
maxNumberOfLines = 0;
|
||||
}
|
||||
|
||||
-(void)setMinNumberOfLines:(int)m
|
||||
{
|
||||
if(m == 0 && minHeight > 0) return; // the user specified a minHeight themselves.
|
||||
|
||||
// Use internalTextView for height calculations, thanks to Gwynne <http://blog.darkrainfall.org/>
|
||||
NSString *saveText = internalTextView.text, *newText = @"-";
|
||||
|
||||
internalTextView.delegate = nil;
|
||||
internalTextView.hidden = YES;
|
||||
|
||||
for (int i = 1; i < m; ++i)
|
||||
newText = [newText stringByAppendingString:@"\n|W|"];
|
||||
|
||||
internalTextView.text = newText;
|
||||
|
||||
minHeight = [self measureHeight];
|
||||
|
||||
internalTextView.text = saveText;
|
||||
internalTextView.hidden = NO;
|
||||
internalTextView.delegate = self;
|
||||
|
||||
[self sizeToFit];
|
||||
|
||||
minNumberOfLines = m;
|
||||
}
|
||||
|
||||
-(int)minNumberOfLines
|
||||
{
|
||||
return minNumberOfLines;
|
||||
}
|
||||
|
||||
- (void)setMinHeight:(int)height
|
||||
{
|
||||
minHeight = height;
|
||||
minNumberOfLines = 0;
|
||||
}
|
||||
|
||||
- (NSString *)placeholder
|
||||
{
|
||||
return internalTextView.placeholder;
|
||||
}
|
||||
|
||||
- (void)setPlaceholder:(NSString *)placeholder
|
||||
{
|
||||
[internalTextView setPlaceholder:placeholder];
|
||||
[internalTextView setNeedsDisplay];
|
||||
}
|
||||
|
||||
- (UIColor *)placeholderColor
|
||||
{
|
||||
return internalTextView.placeholderColor;
|
||||
}
|
||||
|
||||
- (void)setPlaceholderColor:(UIColor *)placeholderColor
|
||||
{
|
||||
[internalTextView setPlaceholderColor:placeholderColor];
|
||||
}
|
||||
|
||||
- (void)textViewDidChange:(UITextView *)textView
|
||||
{
|
||||
[self refreshHeight];
|
||||
}
|
||||
|
||||
- (void)refreshHeight
|
||||
{
|
||||
//size of content, so we can set the frame of self
|
||||
NSInteger newSizeH = [self measureHeight];
|
||||
if (newSizeH < minHeight || !internalTextView.hasText) {
|
||||
newSizeH = minHeight; //not smalles than minHeight
|
||||
}
|
||||
else if (maxHeight && newSizeH > maxHeight) {
|
||||
newSizeH = maxHeight; // not taller than maxHeight
|
||||
}
|
||||
|
||||
if (internalTextView.frame.size.height != newSizeH)
|
||||
{
|
||||
// if our new height is greater than the maxHeight
|
||||
// sets not set the height or move things
|
||||
// around and enable scrolling
|
||||
if (newSizeH >= maxHeight)
|
||||
{
|
||||
if(!internalTextView.scrollEnabled){
|
||||
internalTextView.scrollEnabled = YES;
|
||||
[internalTextView flashScrollIndicators];
|
||||
}
|
||||
|
||||
} else {
|
||||
internalTextView.scrollEnabled = NO;
|
||||
}
|
||||
|
||||
// [fixed] Pasting too much text into the view failed to fire the height change,
|
||||
// thanks to Gwynne <http://blog.darkrainfall.org/>
|
||||
if (newSizeH <= maxHeight)
|
||||
{
|
||||
if(animateHeightChange) {
|
||||
|
||||
if ([UIView resolveClassMethod:@selector(animateWithDuration:animations:)]) {
|
||||
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000
|
||||
[UIView animateWithDuration:animationDuration
|
||||
delay:0
|
||||
options:(UIViewAnimationOptionAllowUserInteraction|
|
||||
UIViewAnimationOptionBeginFromCurrentState)
|
||||
animations:^(void) {
|
||||
[self resizeTextView:newSizeH];
|
||||
}
|
||||
completion:^(BOOL finished) {
|
||||
if ([delegate respondsToSelector:@selector(growingTextView:didChangeHeight:)]) {
|
||||
[delegate growingTextView:self didChangeHeight:newSizeH];
|
||||
}
|
||||
}];
|
||||
#endif
|
||||
} else {
|
||||
[UIView beginAnimations:@"" context:nil];
|
||||
[UIView setAnimationDuration:animationDuration];
|
||||
[UIView setAnimationDelegate:self];
|
||||
[UIView setAnimationDidStopSelector:@selector(growDidStop)];
|
||||
[UIView setAnimationBeginsFromCurrentState:YES];
|
||||
[self resizeTextView:newSizeH];
|
||||
[UIView commitAnimations];
|
||||
}
|
||||
} else {
|
||||
[self resizeTextView:newSizeH];
|
||||
// [fixed] The growingTextView:didChangeHeight: delegate method was not called at all when not animating height changes.
|
||||
// thanks to Gwynne <http://blog.darkrainfall.org/>
|
||||
|
||||
if ([delegate respondsToSelector:@selector(growingTextView:didChangeHeight:)]) {
|
||||
[delegate growingTextView:self didChangeHeight:newSizeH];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Display (or not) the placeholder string
|
||||
|
||||
BOOL wasDisplayingPlaceholder = internalTextView.displayPlaceHolder;
|
||||
internalTextView.displayPlaceHolder = self.internalTextView.text.length == 0;
|
||||
|
||||
if (wasDisplayingPlaceholder != internalTextView.displayPlaceHolder) {
|
||||
[internalTextView setNeedsDisplay];
|
||||
}
|
||||
|
||||
|
||||
// scroll to caret (needed on iOS7)
|
||||
if ([self respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)])
|
||||
{
|
||||
[self performSelector:@selector(resetScrollPositionForIOS7) withObject:nil afterDelay:0.1f];
|
||||
}
|
||||
|
||||
// Tell the delegate that the text view changed
|
||||
if ([delegate respondsToSelector:@selector(growingTextViewDidChange:)]) {
|
||||
[delegate growingTextViewDidChange:self];
|
||||
}
|
||||
}
|
||||
|
||||
// Code from apple developer forum - @Steve Krulewitz, @Mark Marszal, @Eric Silverberg
|
||||
- (CGFloat)measureHeight
|
||||
{
|
||||
if ([self respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)])
|
||||
{
|
||||
return ceilf([self.internalTextView sizeThatFits:self.internalTextView.frame.size].height);
|
||||
}
|
||||
else {
|
||||
return self.internalTextView.contentSize.height;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)resetScrollPositionForIOS7
|
||||
{
|
||||
CGRect r = [internalTextView caretRectForPosition:internalTextView.selectedTextRange.end];
|
||||
CGFloat caretY = MAX(r.origin.y - internalTextView.frame.size.height + r.size.height + 8, 0);
|
||||
if (internalTextView.contentOffset.y < caretY && r.origin.y != INFINITY)
|
||||
internalTextView.contentOffset = CGPointMake(0, caretY);
|
||||
}
|
||||
|
||||
-(void)resizeTextView:(NSInteger)newSizeH
|
||||
{
|
||||
if ([delegate respondsToSelector:@selector(growingTextView:willChangeHeight:)]) {
|
||||
[delegate growingTextView:self willChangeHeight:newSizeH];
|
||||
}
|
||||
|
||||
CGRect internalTextViewFrame = self.frame;
|
||||
internalTextViewFrame.size.height = newSizeH; // + padding
|
||||
self.frame = internalTextViewFrame;
|
||||
|
||||
internalTextViewFrame.origin.y = contentInset.top - contentInset.bottom;
|
||||
internalTextViewFrame.origin.x = contentInset.left;
|
||||
|
||||
if(!CGRectEqualToRect(internalTextView.frame, internalTextViewFrame)) internalTextView.frame = internalTextViewFrame;
|
||||
}
|
||||
|
||||
- (void)growDidStop
|
||||
{
|
||||
// scroll to caret (needed on iOS7)
|
||||
if ([self respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)])
|
||||
{
|
||||
[self resetScrollPositionForIOS7];
|
||||
}
|
||||
|
||||
if ([delegate respondsToSelector:@selector(growingTextView:didChangeHeight:)]) {
|
||||
[delegate growingTextView:self didChangeHeight:self.frame.size.height];
|
||||
}
|
||||
}
|
||||
|
||||
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
|
||||
{
|
||||
[internalTextView becomeFirstResponder];
|
||||
}
|
||||
|
||||
- (BOOL)becomeFirstResponder
|
||||
{
|
||||
[super becomeFirstResponder];
|
||||
return [self.internalTextView becomeFirstResponder];
|
||||
}
|
||||
|
||||
-(BOOL)resignFirstResponder
|
||||
{
|
||||
[super resignFirstResponder];
|
||||
return [internalTextView resignFirstResponder];
|
||||
}
|
||||
|
||||
-(BOOL)isFirstResponder
|
||||
{
|
||||
return [self.internalTextView isFirstResponder];
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark UITextView properties
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setText:(NSString *)newText
|
||||
{
|
||||
internalTextView.text = newText;
|
||||
|
||||
// include this line to analyze the height of the textview.
|
||||
// fix from Ankit Thakur
|
||||
[self performSelector:@selector(textViewDidChange:) withObject:internalTextView];
|
||||
}
|
||||
|
||||
-(NSString*) text
|
||||
{
|
||||
return internalTextView.text;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setFont:(UIFont *)afont
|
||||
{
|
||||
internalTextView.font= afont;
|
||||
|
||||
[self setMaxNumberOfLines:maxNumberOfLines];
|
||||
[self setMinNumberOfLines:minNumberOfLines];
|
||||
}
|
||||
|
||||
-(UIFont *)font
|
||||
{
|
||||
return internalTextView.font;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setTextColor:(UIColor *)color
|
||||
{
|
||||
internalTextView.textColor = color;
|
||||
}
|
||||
|
||||
-(UIColor*)textColor{
|
||||
return internalTextView.textColor;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setBackgroundColor:(UIColor *)backgroundColor
|
||||
{
|
||||
[super setBackgroundColor:backgroundColor];
|
||||
internalTextView.backgroundColor = backgroundColor;
|
||||
}
|
||||
|
||||
-(UIColor*)backgroundColor
|
||||
{
|
||||
return internalTextView.backgroundColor;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setTextAlignment:(NSTextAlignment)aligment
|
||||
{
|
||||
internalTextView.textAlignment = aligment;
|
||||
}
|
||||
|
||||
-(NSTextAlignment)textAlignment
|
||||
{
|
||||
return internalTextView.textAlignment;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setSelectedRange:(NSRange)range
|
||||
{
|
||||
internalTextView.selectedRange = range;
|
||||
}
|
||||
|
||||
-(NSRange)selectedRange
|
||||
{
|
||||
return internalTextView.selectedRange;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (void)setIsScrollable:(BOOL)isScrollable
|
||||
{
|
||||
internalTextView.scrollEnabled = isScrollable;
|
||||
}
|
||||
|
||||
- (BOOL)isScrollable
|
||||
{
|
||||
return internalTextView.scrollEnabled;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setEditable:(BOOL)beditable
|
||||
{
|
||||
internalTextView.editable = beditable;
|
||||
}
|
||||
|
||||
-(BOOL)isEditable
|
||||
{
|
||||
return internalTextView.editable;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setReturnKeyType:(UIReturnKeyType)keyType
|
||||
{
|
||||
internalTextView.returnKeyType = keyType;
|
||||
}
|
||||
|
||||
-(UIReturnKeyType)returnKeyType
|
||||
{
|
||||
return internalTextView.returnKeyType;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (void)setKeyboardType:(UIKeyboardType)keyType
|
||||
{
|
||||
internalTextView.keyboardType = keyType;
|
||||
}
|
||||
|
||||
- (UIKeyboardType)keyboardType
|
||||
{
|
||||
return internalTextView.keyboardType;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (void)setEnablesReturnKeyAutomatically:(BOOL)enablesReturnKeyAutomatically
|
||||
{
|
||||
internalTextView.enablesReturnKeyAutomatically = enablesReturnKeyAutomatically;
|
||||
}
|
||||
|
||||
- (BOOL)enablesReturnKeyAutomatically
|
||||
{
|
||||
return internalTextView.enablesReturnKeyAutomatically;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
-(void)setDataDetectorTypes:(UIDataDetectorTypes)datadetector
|
||||
{
|
||||
internalTextView.dataDetectorTypes = datadetector;
|
||||
}
|
||||
|
||||
-(UIDataDetectorTypes)dataDetectorTypes
|
||||
{
|
||||
return internalTextView.dataDetectorTypes;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
- (BOOL)hasText{
|
||||
return [internalTextView hasText];
|
||||
}
|
||||
|
||||
- (void)scrollRangeToVisible:(NSRange)range
|
||||
{
|
||||
[internalTextView scrollRangeToVisible:range];
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
#pragma mark -
|
||||
#pragma mark UITextViewDelegate
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView {
|
||||
if ([delegate respondsToSelector:@selector(growingTextViewShouldBeginEditing:)]) {
|
||||
return [delegate growingTextViewShouldBeginEditing:self];
|
||||
|
||||
} else {
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
- (BOOL)textViewShouldEndEditing:(UITextView *)textView {
|
||||
if ([delegate respondsToSelector:@selector(growingTextViewShouldEndEditing:)]) {
|
||||
return [delegate growingTextViewShouldEndEditing:self];
|
||||
|
||||
} else {
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
- (void)textViewDidBeginEditing:(UITextView *)textView {
|
||||
if ([delegate respondsToSelector:@selector(growingTextViewDidBeginEditing:)]) {
|
||||
[delegate growingTextViewDidBeginEditing:self];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
- (void)textViewDidEndEditing:(UITextView *)textView {
|
||||
if ([delegate respondsToSelector:@selector(growingTextViewDidEndEditing:)]) {
|
||||
[delegate growingTextViewDidEndEditing:self];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
|
||||
replacementText:(NSString *)atext {
|
||||
|
||||
//weird 1 pixel bug when clicking backspace when textView is empty
|
||||
if(![textView hasText] && [atext isEqualToString:@""]) return NO;
|
||||
|
||||
//Added by bretdabaker: sometimes we want to handle this ourselves
|
||||
if ([delegate respondsToSelector:@selector(growingTextView:shouldChangeTextInRange:replacementText:)])
|
||||
return [delegate growingTextView:self shouldChangeTextInRange:range replacementText:atext];
|
||||
|
||||
if ([atext isEqualToString:@"\n"]) {
|
||||
if ([delegate respondsToSelector:@selector(growingTextViewShouldReturn:)]) {
|
||||
if (![delegate performSelector:@selector(growingTextViewShouldReturn:) withObject:self]) {
|
||||
return YES;
|
||||
} else {
|
||||
[textView resignFirstResponder];
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return YES;
|
||||
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
- (void)textViewDidChangeSelection:(UITextView *)textView {
|
||||
if ([delegate respondsToSelector:@selector(growingTextViewDidChangeSelection:)]) {
|
||||
[delegate growingTextViewDidChangeSelection:self];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
|
@ -1,37 +0,0 @@
|
|||
//
|
||||
// HPTextViewInternal.h
|
||||
//
|
||||
// Created by Hans Pinckaers on 29-06-10.
|
||||
//
|
||||
// MIT License
|
||||
//
|
||||
// Copyright (c) 2011 Hans Pinckaers
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
|
||||
@interface HPTextViewInternal : UITextView
|
||||
|
||||
@property (nonatomic, strong) NSString *placeholder;
|
||||
@property (nonatomic, strong) UIColor *placeholderColor;
|
||||
@property (nonatomic) BOOL displayPlaceHolder;
|
||||
|
||||
@end
|
|
@ -1,126 +0,0 @@
|
|||
//
|
||||
// HPTextViewInternal.m
|
||||
//
|
||||
// Created by Hans Pinckaers on 29-06-10.
|
||||
//
|
||||
// MIT License
|
||||
//
|
||||
// Copyright (c) 2011 Hans Pinckaers
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
#import "HPTextViewInternal.h"
|
||||
|
||||
|
||||
@implementation HPTextViewInternal
|
||||
|
||||
-(void)setText:(NSString *)text
|
||||
{
|
||||
BOOL originalValue = self.scrollEnabled;
|
||||
//If one of GrowingTextView's superviews is a scrollView, and self.scrollEnabled == NO,
|
||||
//setting the text programatically will cause UIKit to search upwards until it finds a scrollView with scrollEnabled==yes
|
||||
//then scroll it erratically. Setting scrollEnabled temporarily to YES prevents this.
|
||||
[self setScrollEnabled:YES];
|
||||
[super setText:text];
|
||||
[self setScrollEnabled:originalValue];
|
||||
}
|
||||
|
||||
- (void)setScrollable:(BOOL)isScrollable
|
||||
{
|
||||
[super setScrollEnabled:isScrollable];
|
||||
}
|
||||
|
||||
-(void)setContentOffset:(CGPoint)s
|
||||
{
|
||||
if(self.tracking || self.decelerating){
|
||||
//initiated by user...
|
||||
|
||||
UIEdgeInsets insets = self.contentInset;
|
||||
insets.bottom = 0;
|
||||
insets.top = 0;
|
||||
self.contentInset = insets;
|
||||
|
||||
} else {
|
||||
|
||||
float bottomOffset = (self.contentSize.height - self.frame.size.height + self.contentInset.bottom);
|
||||
if(s.y < bottomOffset && self.scrollEnabled){
|
||||
UIEdgeInsets insets = self.contentInset;
|
||||
insets.bottom = 8;
|
||||
insets.top = 0;
|
||||
self.contentInset = insets;
|
||||
}
|
||||
}
|
||||
|
||||
// Fix "overscrolling" bug
|
||||
if (s.y > self.contentSize.height - self.frame.size.height && !self.decelerating && !self.tracking && !self.dragging)
|
||||
s = CGPointMake(s.x, self.contentSize.height - self.frame.size.height);
|
||||
|
||||
[super setContentOffset:s];
|
||||
}
|
||||
|
||||
-(void)setContentInset:(UIEdgeInsets)s
|
||||
{
|
||||
UIEdgeInsets insets = s;
|
||||
|
||||
if(s.bottom>8) insets.bottom = 0;
|
||||
insets.top = 0;
|
||||
|
||||
[super setContentInset:insets];
|
||||
}
|
||||
|
||||
-(void)setContentSize:(CGSize)contentSize
|
||||
{
|
||||
// is this an iOS5 bug? Need testing!
|
||||
if(self.contentSize.height > contentSize.height)
|
||||
{
|
||||
UIEdgeInsets insets = self.contentInset;
|
||||
insets.bottom = 0;
|
||||
insets.top = 0;
|
||||
self.contentInset = insets;
|
||||
}
|
||||
|
||||
[super setContentSize:contentSize];
|
||||
}
|
||||
|
||||
- (void)drawRect:(CGRect)rect
|
||||
{
|
||||
[super drawRect:rect];
|
||||
if (self.displayPlaceHolder && self.placeholder && self.placeholderColor)
|
||||
{
|
||||
if ([self respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)])
|
||||
{
|
||||
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
|
||||
paragraphStyle.alignment = self.textAlignment;
|
||||
[self.placeholder drawInRect:CGRectMake(5, 8 + self.contentInset.top, self.frame.size.width-self.contentInset.left, self.frame.size.height- self.contentInset.top) withAttributes:@{NSFontAttributeName:self.font, NSForegroundColorAttributeName:self.placeholderColor, NSParagraphStyleAttributeName:paragraphStyle}];
|
||||
}
|
||||
else {
|
||||
[self.placeholderColor set];
|
||||
[self.placeholder drawInRect:CGRectMake(8.0f, 8.0f, self.frame.size.width - 16.0f, self.frame.size.height - 16.0f) withFont:self.font];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-(void)setPlaceholder:(NSString *)placeholder
|
||||
{
|
||||
_placeholder = placeholder;
|
||||
|
||||
[self setNeedsDisplay];
|
||||
}
|
||||
|
||||
@end
|
Loading…
Reference in a new issue