W IB jest opcja usunięcia zaznaczenia przewijania w pionie w widoku scrollview, ale wydaje się, że nie działa.
W jaki sposób można ustawić widok przewijania tak, aby w kodzie przewijał się tylko poziomo, a nie pionowo, a nie IB?
iphone
ios
uiscrollview
system
źródło
źródło
Odpowiedzi:
Spróbuj ustawić wysokość contentSize na wysokość scrollView. Następnie należy wyłączyć przewijanie w pionie, ponieważ nie byłoby nic do przewijania w pionie.
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);
źródło
od iOS7:
po pierwsze: szerokość rozmiaru treści musi być równa szerokości widoku przewijania
po drugie: w twoim initWithNibName:
self.automaticallyAdjustsScrollViewInsets = NO;
Otóż to.
źródło
tak, odpowiedź pt2ph8 jest prawidłowa,
ale jeśli z jakiegoś dziwnego powodu rozmiar contentSize powinien być wyższy niż UIScrollView, możesz wyłączyć przewijanie w pionie implementując metodę protokołu UIScrollView
-(void)scrollViewDidScroll:(UIScrollView *)aScrollView;
po prostu dodaj to do swojego UIViewController
float oldY; // here or better in .h interface - (void)scrollViewDidScroll:(UIScrollView *)aScrollView { [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)]; // or if you are sure you wanna it always on top: // [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)]; }
jest to po prostu metoda wywoływana, gdy użytkownik przewija twój UIScrollView, i robiąc to, wymuszasz, aby jego zawartość była zawsze taka sama .y
źródło
float oldY;
w powyższym kodzie. To jest symbol zmiennej w stylu C dla każdej aplikacji, zmienna MUSI być zadeklarowana jako element instancji klasy kontrolera.Uwzględnij następującą metodę
-(void)viewDidLayoutSubviews{ self.automaticallyAdjustsScrollViewInsets = NO; }
i ustaw szerokość rozmiaru zawartości widoku przewijania równą szerokości widoku przewijania.
źródło
Musisz przekazać 0 w rozmiarze zawartości, aby wyłączyć w wybranym kierunku.
Wyłączanie przewijania w pionie
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);
Wyłączanie przewijania w poziomie
scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);
źródło
Zaktualizowałem rozmiar treści, aby wyłączyć przewijanie w pionie, a możliwość przewijania nadal pozostała. Potem doszedłem do wniosku, że muszę również wyłączyć odbijanie w pionie, aby całkowicie wyłączyć przewijanie.
Może są też ludzie z tym problemem.
źródło
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView { [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)]; }
musisz to potwierdzić
UIScrollViewDelegate
aScrollView.delegate = self;
źródło
Po prostu ustaw y, aby zawsze był na wierzchu. Należy zachować zgodność z UIScrollViewDelegate
func scrollViewDidScroll(scrollView: UIScrollView) { scrollView.contentOffset.y = 0.0 }
Pozwoli to zachować efekt spowolnienia / przyspieszenia przewijania.
źródło
W systemie iOS 11 pamiętaj, aby dodać następujące informacje, jeśli chcesz utworzyć widok przewijania, który przylega do granic ekranu, a nie do bezpiecznego obszaru:
if (@available(iOS 11.0, *)) { [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever]; }
źródło
Z iOS11 można skorzystać z następującej własności
let frameLayoutGuide: UILayoutGuide
Jeśli ustawisz ograniczenia dla frameLayoutGuide.topAnchor i frameLayoutGuide.bottomAnchor tych samych kotwic jakiś podrzędny swojego Scrollview następnie przewijania pionowego będzie wyłączona, a wysokość Scrollview będzie równa wysokości jego podrzędny.
źródło
Najbardziej oczywistym rozwiązaniem jest zakaz zmian współrzędnych y w Twojej podklasie.
override var contentOffset: CGPoint { get { return super.contentOffset } set { super.contentOffset = CGPoint(x: newValue.x, y: 0) } }
To jedyne odpowiednie rozwiązanie w sytuacjach, gdy:
źródło
Wiele odpowiedzi obejmuje ustawienie wartości
contentOffset
0. Miałem przypadek, w którym chciałem, aby widok wewnątrz scrollView był wyśrodkowany. To wykonało pracę za mnie:public func scrollViewDidScroll(_ scrollView: UIScrollView) { scrollView.contentOffset.y = -scrollView.contentInset.top }
źródło