2

ズーム可能なUIScrollviewがあります。サブビューは、内部にUILabel(messageLabel)を含む1つのUIView(viewTexto)です。

これはコードです

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollViewtmp{

    return viewTexto;
}
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollViewtmp withView:(UIView *)view atScale:(float)scale{

        messageLabel.contentScaleFactor=scale;

    [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, messageLabel.frame.origin.y + messageLabel.frame.size.heightt)];

    }

このコードを使用すると、ズームでき、テキストがぼやけることはなく、水平スクロールはありませんが、UILabelのサイズが大きすぎるため、カットされます。UILabelの幅が最初と同じようにscrollViewの幅に再び採用される必要があります。

SOのUIScrollViewsに関する質問を読み、必要なものを正確に見つけました。

4

2 に答える 2

2

OK、それで最終的に私はIsmaelが幅を調整しなければならないと提案したので答えを見つけました、問題は方程式を見つけることでした。

スケーリングの仕組みとスクロールビューのサブビューの幅は、最初は明らかではありません。

スクロールビューでUIViewを拡大縮小し、同じ幅にしたい場合は、要素の幅を拡大縮小で割る必要があります。

つまり、最初の幅が600だった場合、スケーリングすると幅が変更されたと考えることができ、600に再度サイズ変更するだけで済みますが、そうではありません。600は自動的にスケールで乗算されます。したがって、正しい答えは、600/スケールにサイズ変更することです。ここで分割します。

今コード:

すべてがメソッドで発生します:

-(void)scrollViewDidEndZooming:(UIScrollView *)scrollViewtmp withView:(UIView *)view atScale:(float)scale{}

最初にしたことは、ぼやけたフォントを取り除くことでした。

 messageLabel.contentScaleFactor=scale;

別のメソッドでは、UILabel messageLabelの初期幅(scrollview内)を保存し、変数「initialWidth」を呼び出しました。これは600でした。これは、scrollViewDidEndZoomingメソッドで現在のmessageLabel幅を1回使用し始めたため重要です。

スクロールビューのサブビューの幅を600に再調整するには、初期幅をズームスケールで除算し、ラベルを再調整するだけです。

[messageLabel setFrame:CGRectMake(0,0,(initialWidth/scale), messageLabel.frame.size.height)];
[messageLabel sizeToFit];

この時点で、ズーム可能なスクロールビューがあり、テキストをスクロールビューの初期幅に再調整するラベルがあり、水平スクロールバーはありませんが、問題があります。垂直スクロールバーの高さが間違っています。テキストの一部しかスクロールできません。

これは解決するのが難しい2番目の問題でした。messageLabelの高さをcontentsizeに渡すと、不思議なことに機能していないように見えます。NSLogで高さにスケールを掛けても、内部で分割されているかのように、スクロールの高さは変更されません。また。たとえば、初期の高さが500の場合、2でスケーリングした後、1000の高さが得られます。この値をContentSizeに渡すと、2で割った場合と同じままになります。

したがって、解決策は今回はスケールを掛けることでした。

次の行を追加するだけです。

   [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width, (messageLabel.frame.origin.y+messageLabel.frame.size.height)*scale)];

ご覧のように、難しい部分は、スケールで除算または乗算することでこの混乱を理解することでした。

于 2012-11-23T16:56:16.937 に答える
0

ズーム後、は比例contentSizeしてUIScrollView増加するため(originalContentSize * ZoomScale)、再度調整すると小さくなります。

例:あなたscrollView.frameは(0、0、100、100)であり、あなたcontentSizeは(100、100)です。2.0にズームするcontentSizeと、(200、200)になります。次に、手動で(100、100)に配置します。これはcontentSize、ズームなしの(50、50)に相当します。

contentSize.width <= scrollView.frame.size.width)以降、水平方向のスクロールはなく、ラベルの右端の部分は表示されません。

を調整しないでくださいcontentSize。そうすればスクロールが可能になり、ユーザーはラベル全体にアクセスできます。

編集:質問を読み直して、ズーム後にラベルを調整して完全に表示したい場合は、フレームの調整に加えて、フレームを調整する必要がありcontentSizeますmessageLabel's。ラベルは適切に折り返される必要があります

于 2012-11-23T13:58:10.680 に答える