2012-12-04 17 views
15

ViewDidLoad üzerinde her zaman görünür bir kaydırma çubuğu yapmalıyım, böylece kullanıcı kaydırılacak içerik olduğunu anlayabilir. Yaptığım şu:UIScrollView'de kaydırma çubuğu daima görünür hale getirilsin mi?

[myscrollView flashScrollIndicators]; 

Ama

Ben kaydırma çubukları her zaman görünür yapmak gerekir .. sonra kaydırma çubukları sadece viewDidLoad sonra bir süre görünür ve kullanıcı ekrana dokunduğunda yeniden için tekrar kaybolur. Nasıl yapabilirim?

+0

Cudnt anladın mı, dokunmatik ekranda görünen scrollviews nelerdir? Ayrıca kaydırma çubukları nasıl kayboluyor? Bir zamanlayıcı koydu mu yoksa bir sonraki görüşe gidip geri geliyor musun? – IronManGill

+0

evet, [myscrollView flashScrollIndicators] kullanıyorum; onlar viewLoad üzerinde görünür ve daha sonra bir kaç saniye sonra kayboldu. Ben onları alwayz görünür yapmak istiyorum .. Hayır geri gidiş ve fro yok. – Honey

+0

bunu kontrol edin http://stackoverflow.com/questions/3290813/uiscrollview-indicator-always-show – Divya

cevap

16

Elma dolaylı olarak iOS Human Interface Guidelines yılında kaydırma göstergelerini gösteren sürekli vazgeçirmek ama kurallar bir nedeni sadece yönlendirme amaçlı referans onlar don Her senaryoyu hesaba katıyorsunuz ve bazen onları görmezden gelmeniz gerekebilir.

Herhangi bir içerik görünümünün kaydırma göstergeleri, bu içerik görünümlerinin UIImageView alt görünümleridir. Bu, olabildiğince erişim onun diğer subviews (yani myScrollView.subviews) ve herhangi biri gibi kaydırma göstergeleri değiştirmek gibi bir UIScrollView kaydırma göstergeleri seçerek diğer UIImageView (örneğin scrollIndicatorImageView.backgroundColor = [UIColor redColor];).

#define noDisableVerticalScrollTag 836913 
#define noDisableHorizontalScrollTag 836914 

@implementation UIImageView (ForScrollView) 

- (void) setAlpha:(float)alpha { 

    if (self.superview.tag == noDisableVerticalScrollTag) { 
     if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleLeftMargin) { 
      if (self.frame.size.width < 10 && self.frame.size.height > self.frame.size.width) { 
       UIScrollView *sc = (UIScrollView*)self.superview; 
       if (sc.frame.size.height < sc.contentSize.height) { 
        return; 
       } 
      } 
     } 
    } 

    if (self.superview.tag == noDisableHorizontalScrollTag) { 
     if (alpha == 0 && self.autoresizingMask == UIViewAutoresizingFlexibleTopMargin) { 
      if (self.frame.size.height < 10 && self.frame.size.height < self.frame.size.width) { 
       UIScrollView *sc = (UIScrollView*)self.superview; 
       if (sc.frame.size.width < sc.contentSize.width) { 
        return; 
       } 
      } 
     } 
    } 

    [super setAlpha:alpha]; 
} 

@end 

aslen this source yansıtılır:

en popüler çözüm aşağıdaki kod gibi görünüyor.

Bu, alpha özelliği için bir özel belirleyici tanımlayan UIImageView için bir kategori tanımlar. Bu, UIScrollView için temeldeki kodun bir noktasında, onu gizlemek için kaydırma göstergesinin alpha özelliğini 0'a ayarlayacağından çalışır. Bu noktada, bizim kategorimiz üzerinden çalışacak ve eğer UIScrollView barındırma doğru etiketi varsa, ayarlanan değeri göz ardı ederek görüntülenecektir.

Bu çözümü kullanmak için, UIScrollView numaranızın uygun etikete sahip olduğundan emin olun.

Kaydırma göstergesini UIScrollView göründüğü andan itibaren görüntülemek isterseniz, sadece görüntülendiğinde kaydırma göstergelerini yanıp sönmeye başlayabilirsiniz.g

- (void)viewDidAppear:(BOOL)animate 
{ 
    [super viewDidAppear:animate]; 
    [self.scrollView flashScrollIndicators]; 
} 

Ek SO referanslar:

+0

Gerçekten bir çekicilik gibi çalışır. Cevap için teşekkürler. – Gypsa

+0

Bunu, her zaman doğru olmayabilecek özel bir uygulama detayına (göstergelerin "UIImageView" nesneleri) bağlı olduğunu söyleyerek bunu reddederdim. Aslında, normalde yeni bir iOS sürümünde bunu beklemediğinizde bunun kesintiye uğrayacağını söyleyen bir kanun. Yani bunu kullanırsanız, kilometrelerinizin değişebileceğini unutmayın. – lxt

+1

iOS7'de çalışmıyor .. –

0

Bunun işe yarayıp yaramadığını bilmiyorum. Ama sadece senin için bir ipucu. Scrollview öğesinin içinde kaydırma çubuğu, bir Imageview'dir. UIScrollview

'un bir alt görünümü olan UIscrollview'in Scrollbar Görüntü Görünümü'nü edinin. Sonra HAYIR veya değiştirme Alfa değerine gizlenmiş o görüntü özelliğini ayarlamaya

static const int UIScrollViewHorizontalBarIndexOffset = 0; 
static const int UIScrollViewVerticalBarIndexOffset = 1; 
-(UIImageView *)scrollbarImageViewWithIndex:(int)indexOffset 
{ 
    int viewsCount = [[yourScrollview subviews] count]; 
    UIImageView *scrollBar = [[yourScrollview subviews] objectAtIndex:viewsCount - indexOffset - 1]; 
    return scrollBar; 
} 

-(void) viewDidLoad 
{ 
    //Some Code 
    //Get Scrollbar 
    UIImageView *scrollBar = [self scrollbarImageViewWithIndex: UIScrollViewVerticalBarIndexOffset]; 

    //The try setting hidden property/ alpha value 
    scrollBar.hidden=NO; 
} 

Got, here

+0

Aslında verdiğim örnekte bunu kontrol ettim.Germe çubuklarının renklerini değiştirmekle ilgili.Ama bunların görüntülenmesi için sürekli olarak (her zaman görünür) görüntülenmesi gerekiyor – Honey

+0

biliyorum .. jst a ipucu Bu görüntüyü almak için. Scrolbar nesnesini aldığınıza göre .. sadece gizli özelliği veya alfa değerini ayarlayarak bununla işlem yapın. Böylece her zaman gösterilecektir. – iPrabu

+0

Gizli özellik için denedim.ama işe yaramıyor..Ana lütfen bana alfa değerini kullanarak nasıl yapabilirim? – Honey

3

benim çözüm sunmak istiyorum. Kategori ile en popüler varyantı sevmiyorum (kategorideki geçersiz kılma yöntemleri, aynı seçiciye sahip iki yöntem olduğu için çalışma zamanında çağrılması gereken bazı belirsizliğin nedeni olabilir). Bunun yerine swizzling kullanıyorum. Ayrıca etiket kullanmaya gerek yok.

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    // Do swizzling to turn scroll indicator always on 
    // Search correct subview with scroll indicator image across tableView subviews 
    for (UIView * view in self.categoriesTableView.subviews) { 
     if ([view isKindOfClass:[UIImageView class]]) { 
      if (view.alpha == 0 && view.autoresizingMask == UIViewAutoresizingFlexibleLeftMargin) { 
       if (view.frame.size.width < 10 && view.frame.size.height > view.frame.size.width) { 
        if (self.categoriesTableView.frame.size.height < self.categoriesTableView.contentSize.height) { 
         // Swizzle class for found imageView, that should be scroll indicator 
         object_setClass(view, [AlwaysOpaqueImageView class]); 
         break; 
        } 
       } 
      } 
     } 
    } 
    // Ask to flash indicator to turn it on 
    [self.categoriesTableView flashScrollIndicators]; 
} 

bu durumda

@interface AlwaysOpaqueImageView : UIImageView 
@end 

@implementation AlwaysOpaqueImageView 

- (void)setAlpha:(CGFloat)alpha { 
    [super setAlpha:1.0]; 
} 

@end 

kaydırma göstergesini (dikey kaydırma göstergesi yeni bir sınıf ekleyin (benim durumumda self.categoriesTableView) görünümü kaydırmak olduğunuz görünümü denetleyicisi, bu yöntemi ekle) her zaman ekranda olacak.

+0

iOS 10'u kullanarak, bu çalışır. Yatay kaydırma çubuğunu kullanmak isterseniz: UIViewAutoresizing.flexibleTopMargin (Swift 3.0) veya UIViewAutoresizingFlexibleTopMargin (Obj-C) –

+1

iOS 11'de harika bir şekilde çalıştı. # Object gerek. – Smartcat

İlgili konular