9

テキストを入力しながら動的に拡張するものを作成UITextViewし、ユーザーが画面をつまむとスケーリングすることに興味があります(同様の動作はTinyPostにあります)。

(ピンチせずに)入力するだけで、textViewが正常に展開されます。(入力せずに)つまむだけでも問題ありませんが、つまんでから入力すると、中のテキストが切り取られます。

これが私のコードです:

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  
    }

どう思いますか?

4

5 に答える 5

14

試す:

- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{
     CGFloat scale = pinchGestRecognizer.scale;

    createTextView.font = [UIFont fontWithName:createTextView.font.fontName size:createTextView.font.pointSize*scale];

    [self textViewDidChange:createTextView];       
}

基本的にフォントサイズをスケーリングし、textViewDidChangeのコードを使用してコンテンツサイズを再計算します。

于 2012-12-06T20:24:44.550 に答える
2

上記の@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;
}
于 2014-06-20T20:40:46.353 に答える
2

まず、アドインUIPinchGestureRecognizerメソッドviewDidLoad

UIPinchGestureRecognizer *pinchOnTextfield = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleTextFieldFontOnAddMusicVc:)];
[self.myTextField addGestureRecognizer:pinchOnTextfield];

次に、このメソッドをフォントviewControllerを拡大縮小するために配置します。textField

- (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;

    }    
}
于 2015-10-06T12:01:04.187 に答える
0

UITextViewはUIScrollViewのサブクラスであるため、ズームを有効にするには、スクロールビューで行うことを実行する必要があります。

  • 最小および最大ズームスケールプロパティを設定します
  • scrollviewデリゲートメソッドを介してviewForZoomingを設定します

...テキストビュー全体をズームします。

テキストをズームするだけの場合は、ピンチジェスチャレコグナイザーを介して次の手順を実行する必要があります。

  • 現在の属性文字列を取得します
  • フォント範囲をウォークスルーし、フォント属性をスケーリングされたものに置き換えます
  • テキストビューのテキストを変更したバージョンに置き換えます
  • おそらく、テキストを設定した後、テキストの選択も設定する必要があります
于 2012-12-10T09:16:10.463 に答える
0

最善ではありませんが、簡単な解決策は次のとおりです。

あなたのユースケースは正確にはわかりませんが、テキストを入力するときにアプリのピンチズームでサポートすることは多くの場合意味がないと思います。ユーザーがテキストを入力しているときにピンチズームを防ぐフラグを設定するだけです。

テキスト入力、テキストビューの編集を意味する場合は、ピンチジェスチャの開始時に編集を終了し、ピンチジェスチャが終了した後に編集を開始できます。

于 2012-12-10T13:05:15.167 に答える