Iphone iOS:使用pinching缩放UITextView?
我感兴趣的是创建Iphone iOS:使用pinching缩放UITextView?,iphone,ios,uitextview,uigesturerecognizer,uipinchgesturerecognizer,Iphone,Ios,Uitextview,Uigesturerecognizer,Uipinchgesturerecognizer,我感兴趣的是创建UITextView,它在键入文本时动态扩展,并在用户挤压屏幕时缩放(类似的行为可以在TinyPost中找到) 当您只需键入(不捏)文本视图即可展开。当你只是捏(不打字)的时候效果很好,但是当你捏然后打字的时候,里面的文本会被剪切 这是我的密码: UIPinchGestureRecognizer *pinchGestRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector
UITextView
,它在键入文本时动态扩展,并在用户挤压屏幕时缩放(类似的行为可以在TinyPost中找到)
当您只需键入(不捏)文本视图即可展开。当你只是捏(不打字)的时候效果很好,但是当你捏然后打字的时候,里面的文本会被剪切
这是我的密码:
UIPinchGestureRecognizer *pinchGestRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleTextView:)];
pinchGestRecognizer.delegate = self;
[bgFrameImageView addGestureRecognizer:pinchGestRecognizer];
- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{
createTextView.transform = CGAffineTransformScale(createTextView.transform, pinchGestRecognizer.scale, pinchGestRecognizer.scale);
pinchGestRecognizer.scale = 1;
}
- (void)textViewDidChange:(UITextView *)textView{
CGSize textSize = textView.contentSize;
textView.frame = CGRectMake(CGRectGetMinX(textView.frame), CGRectGetMinY(textView.frame), textSize.width, textSize.height); //update the size of the textView
}
你觉得怎么样?试试:
- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{
CGFloat scale = pinchGestRecognizer.scale;
createTextView.font = [UIFont fontWithName:createTextView.font.fontName size:createTextView.font.pointSize*scale];
[self textViewDidChange:createTextView];
}
它基本上会缩放字体大小,然后使用textViewDidChange中的代码重新计算内容大小。UITextView是UIScrollView的一个子类,因此您需要对任何滚动视图执行操作以启用缩放:
- 设置最小和最大缩放比例特性
- 通过scrollview委托方法将视图设置为缩放
- 检索当前属性化字符串
- 浏览字体范围并用缩放的字体属性替换字体属性
- 用修改后的版本替换文本视图中的文本
- 在设置文本后,可能还需要设置文本选择
- 不是最好但简单的解决方案是:
我不知道您的具体用例,但我认为在很多情况下,在应用程序中输入文本时支持收缩缩放是没有意义的。我只需要设置一个标志,它可以防止用户在键入文本时收缩缩放
如果您指的是文本输入,编辑文本视图,您可以在捏手势开始时结束编辑,并在捏手势结束后开始编辑。要详细说明上述@Cocoanetics答案。我在iOS 7上实现了属性字符串的手势处理思想,但是当字符串中有太多字体更改时,速度会非常慢。iOS 7中还有一个荒谬的缓冲错误,在你停止挤压后很长一段时间内,更改通知就会不断发出——这让我想起了早期版本的PC-DOS中愚蠢的键盘缓冲。不管怎么说,我已经在下面写了一些代码,这些代码对我来说很有用——尽管它只是告诉我这是在浪费时间,我需要给我的用户一些其他的方式来缩放他们的字体
- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestureRecognizer
{
CGFloat scale = 0;
NSMutableAttributedString *string;
switch (pinchGestureRecognizer.state) {
case UIGestureRecognizerStateBegan:
self.old_scale = 1.0;
self.last_time = [NSDate date];
break;
case UIGestureRecognizerStateChanged:
scale = pinchGestureRecognizer.scale - self.old_scale;
if( [self.last_time timeIntervalSinceNow] < -0.2 ) { // updating 5 times a second is best I can do - faster than this and we get buffered changes going on for ages!
self.last_time = [NSDate date];
string = [self getScaledStringFrom:[self.textview.attributedText mutableCopy] withScale:1.0 + scale];
if( string ) {
self.textview.attributedText = string;
self.old_scale = pinchGestureRecognizer.scale;
}
}
break;
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateCancelled:
case UIGestureRecognizerStateFailed:
break;
default:
break;
}
}
- (NSMutableAttributedString*) getScaledStringFrom:(NSMutableAttributedString*)string withScale:(CGFloat)scale
{
[string beginEditing];
[string enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, string.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) {
if (value) {
UIFont *oldFont = (UIFont *)value;
UIFont *newFont = [oldFont fontWithSize:oldFont.pointSize * scale];
[string removeAttribute:NSFontAttributeName range:range];
[string addAttribute:NSFontAttributeName value:newFont range:range];
}
}];
[string endEditing];
return string;
}
-(void)scaleTextView:(UIPinchGetUreRecognitor*)PinchGetUreRecognitor
{
CGFloat标度=0;
nsmutableAttributeString*字符串;
开关(PinchGestureRecognitor.state){
案例UIgestureRecognitzerStateStart:
self.old_量表=1.0;
self.last_time=[NSDate-date];
打破
案例UIgestureRecognitzerStateChanged:
scale=pinchGestureRecognizer.scale-self.old_scale;
如果([self.last_time timeIntervalSinceNow]<-0.2){//每秒更新5次是我能做的最好的事情-比这更快,而且我们会得到长时间的缓冲更改!
self.last_time=[NSDate-date];
string=[self-getScaledStringFrom:[self.textview.attributedText-mutableCopy],带刻度:1.0+刻度];
如果(字符串){
self.textview.attributedText=字符串;
self.old_scale=pinchgestrerecognizer.scale;
}
}
打破
案例UIgestureRecognitzerStateEnded:
案例UIgestureRecognitizerState已取消:
案例UIgestureRecognitzerStateFailed:
打破
违约:
打破
}
}
-(NSMutableAttributedString*)getScaledStringFrom:(NSMutableAttributedString*)带刻度的字符串:(CGFloat)刻度
{
[字符串开始编辑];
[字符串枚举属性:NSFontAttributeName inRange:NSMakeRange(0,string.length)选项:0使用块:^(id值,NSRange范围,BOOL*stop){
如果(值){
UIFont*oldFont=(UIFont*)值;
UIFont*newFont=[oldFont fontWithSize:oldFont.pointSize*scale];
[字符串removeAttribute:NSFontAttributeName范围:范围];
[字符串addAttribute:NSFontAttributeName值:新字体范围:范围];
}
}];
[字符串重新编辑];
返回字符串;
}
首先,在viewDidLoad
方法中添加uipinchgeturerecognizer
:
UIPinchGestureRecognizer *pinchOnTextfield = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleTextFieldFontOnAddMusicVc:)];
[self.myTextField addGestureRecognizer:pinchOnTextfield];
然后将此方法放入viewController
以缩放textField
font:
- (void)handleTextFieldFontOnAddMusicVc:(UIPinchGestureRecognizer *)pinchGestRecognizer {
if (pinchGestRecognizer.state == UIGestureRecognizerStateEnded || pinchGestRecognizer.state == UIGestureRecognizerStateChanged) {
CGFloat currentFontSize = self.myTextField.font.pointSize;
CGFloat newScale = currentFontSize * pinchGestRecognizer.scale;
if (newScale < 20.0) {
newScale = 20.0;
}
if (newScale > 60.0) {
newScale = 60.0;
}
self.myTextField.font = [UIFont fontWithName:self.myTextField.font.fontName size:newScale];
pinchGestRecognizer.scale = 1;
}
}
-(void)handleTextFieldFontOnAddMusicVc:(UIPinchGestureRecognitor*)PinchGestRecognitor{
如果(pinchGestRecognizer.state==UIGestureRecognizerStateEnded | | pinchGestRecognizer.state==UIGestureRecognizerStateChanged){
CGFloat currentFontSize=self.myTextField.font.pointSize;
CGFloat newScale=currentFontSize*pinchGestrocgnizer.scale;
如果(新闻级<20.0){
newScale=20.0;
}
如果(新闻比例>60.0){
newScale=60.0;
}
self.myTextField.font=[UIFont fontWithName:self.myTextField.font.fontName大小:newScale];
PinchGestrocgnizer.scale=1;
}
}
为什么不将其包装到UIScrollView
中,然后从视图返回文本视图,以便缩放ScrollView:
方法?我建议您解释每一行在k20时的作用,我也有同样的问题,我使用TextField,你能给我一些解决方案吗…谢谢..如果你想在不改变字体属性的情况下缩放UITextView,请在这里检查我的答案:你有没有可能提供示例代码来遍历字体范围并增加UITextView属性字符串中的文本大小。我正试着这么做。我手头没有,基本上你只需要枚举属性字符串上的字体属性,然后用一个缩放的替换它。嗨,amergin。这段代码有什么改进吗?或者你真的放弃了它吗?谢谢你的回复。@Winston-是的,放弃了字体缩放,现在只提供预设大小供用户选择。有点跛,但我在工作