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?
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?
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);
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.
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
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.
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);
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.
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];
}
musisz to potwierdzić UIScrollViewDelegate
aScrollView.delegate = self;
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.
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];
}
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.
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:
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
}