UITextView
UIScrollView
bir alt sınıfıdır, bu nedenle cevap, değil-parçalar veya içerik boyutu değiştiriliyor budur contentOffset
özelliğini kapsar. Görünüm ilk görüntülendiğinde kaydırma konumu doğruysa, daha sonra geri çağırma için içerik ofsetini saklayabilirsiniz.
YourViewController.h
@interface YourViewController : UIViewController <UITextViewDelegate, UIScrollViewDelegate>
@property(nonatomic, weak) IBOutlet UITextView *textView;
@end
YourViewController.m yukarıda geçen yöntemdir kod örneğinde dikkat etmek de önemlidir Ne
@implementation YourViewController {
@private
BOOL _freezeScrolling;
CGFloat _lastContentOffsetY;
}
// UITextViewDelegate
- (void)textViewDidBeginEditing:(UITextView *)textView {
// tell the view to hold the scrolling
_freezeScrolling = YES;
_lastContentOffsetY = self.textView.contentOffset.y;
}
// UITextViewDelegate
- (void)textViewDidEndEditing:(UITextView *)textView {
_freezeScrolling = NO;
}
// UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (_freezeScrolling) {
// prevent the scroll view from actually scrolling when we don't want it to
[self repositionScrollView:scrollView newOffset:CGPointMake(scrollView.contentOffset.x, _lastContentOffsetY)];
}
}
// UIScrollViewDelegate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
// scroll prevention should only be a given scroll event and turned back off afterward
_freezeScrolling = NO;
}
// UIScrollViewDelegate
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {
// when the layout is redrawn, scrolling animates. this ensures that we are freeing the view to scroll
_freezeScrolling = NO;
}
/**
This method allows for changing of the content offset for a UIScrollView without triggering the scrollViewDidScroll: delegate method.
*/
- (void)repositionScrollView:(UIScrollView *)scrollView newOffset:(CGPoint)offset {
CGRect scrollBounds = scrollView.bounds;
scrollBounds.origin = offset;
scrollView.bounds = scrollBounds;
}
pasajı parça alınmıştır. setContentOffset:
'un herhangi bir türünün çağrılması aslında kaydırma işlemini tetikleyecektir, bu da scrollViewDidScroll:
numaralı çağrıya neden olur. Böylece setContentOffset:
numaralı çağrı, sonsuz bir döngü ile sonuçlanır. Kaydırma sınırlarını ayarlamak, bunun için geçici çözümdür. Özetle, görüntü denetleyicisine, kullanıcının düzenleme için metni seçtiğini algıladığında UITextView
'un kaymasını engellemesini söyleriz. Mevcut içerik ofsetini de saklıyoruz (çünkü konumun istediğimiz şey olduğunu biliyoruz). UITextView
kaydırmaya çalışırsa, kaydırma duruncaya kadar içerik ofsetini yerinde tutarız (bu, scrollViewDidEndDecelerating:
veya scrollViewDidEndScrollingAnimation:
'u tetikler). Kullanıcı düzenlemeyi tamamladığında kaydırma işlemini de çözeriz.
Unutmayın, bu temel bir örnektir, bu nedenle kodu istediğiniz tam davranışı temel alarak değiştirmeniz gerekir.
SDK'nın hangi sürümünü kullanıyorsunuz? 3.0? – hanleyp
Evet, SDK 3.0 kullanıyorum – Gero