UITextView выравнивание текста по вертикали
Я хочу выровнять текст по вертикали в центре UItextView
.
Я использую следующий код
UITextView *tv = object;
CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height * [tv zoomScale])/2.0;
topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect}
;
Как-то это не работает в iOS 5, поскольку возвращаемый contentSize отличается от того, что я получаю в iOS6.
Любая идея, почему contentSize
того же textView отличается в iOS 5 и iOS 6?
Ответы
Ответ 1
Добавить наблюдателя для значения ключа contentSize для UITextView при загрузке представления: -
- (void) viewDidLoad {
[textField addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];
[super viewDidLoad];
}
Корректируйте contentOffset каждый раз при изменении значения contentSize: -
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
UITextView *tv = object;
CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height * [tv zoomScale])/2.0;
topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
}
Надеюсь, это поможет вам...
Вы можете взять руководство от
https://github.com/HansPinckaers/GrowingTextView
Ответ 2
попробуйте это на методе observValueForKeyPath на iOS7:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
UITextView *tv = object;
CGFloat height = [tv bounds].size.height;
CGFloat contentheight;
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7")) {
contentheight = [tv sizeThatFits:CGSizeMake(tv.frame.size.width, FLT_MAX)].height;
NSLog(@"iOS7; %f %f", height, contentheight);
}else{
contentheight = [tv contentSize].height;
NSLog(@"iOS6; %f %f", height, contentheight);
}
CGFloat topCorrect = height - contentheight;
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);
tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
}
:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
Ответ 3
Я изменил решение Arpit, чтобы оно соответствовало расширению textview contentView
static NSString *const kContentOffsetKeyPath = @"contentOffset";
-(void)viewDidLoad {
[self.replyTextView addObserver:self
forKeyPath:kContentOffsetKeyPath
options:(NSKeyValueObservingOptionNew)
context:NULL];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:kContentOffsetKeyPath]) {
// To keep scrolling to bottom while typing and text content view is larger than maximum limit
if (textView.contentSize.height > singleLineHeight) {
UITextView *textView = object;
CGFloat topCorrect = ([textView bounds].size.height - [textView contentSize].height * [textView zoomScale]) / 2.0;
CGFloat fineTune = -3.0;
topCorrect = (topCorrect < fineTune ? fineTune : topCorrect);
// To avoid recursion
[textView removeObserver:self forKeyPath:kContentOffsetKeyPath];
textView.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
// add observer back
[textView addObserver:self
forKeyPath:kContentOffsetKeyPath
options:(NSKeyValueObservingOptionNew)
context:NULL];
}
}
}
- (void)dealloc {
[self.replyTextView removeObserver:self forKeyPath:kContentOffsetKeyPath];
}