2013-10-24 2 views
2

У меня возникла проблема с UIScrollView. Я делаю пользовательский вид, который наследует UIView. В представлении есть UIScrollView, на котором есть много кнопок, которые должны прокручиваться влево и вправо. UIScrollView и кнопки могут отображаться нормально. Но я не могу прокручивать кнопки. Может ли кто-нибудь дать мне несколько предложений? Большое спасибо!UIScrollView не прокручивает

MZMPhotoCalenderSwitcher.h

#import <UIKit/UIKit.h> 

@interface MZMPhotoCalenderSwitcher : UIView <UIScrollViewDelegate> 

@property (strong, nonatomic) UIScrollView *topSwitcher; 

@end 

MZMPhotoCalenderSwitcher.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.topSwitcher = [[UIScrollView alloc] initWithFrame:CGRectMake(0, LABEL_HEIGHT + VIEW_Y, self.view.bounds.size.width, TOP_SWITCHER_HEIGHT)]; 
    self.topSwitcher.backgroundColor = [UIColor greenColor]; 
    self.topSwitcher.pagingEnabled = YES; 
    self.topSwitcher.showsHorizontalScrollIndicator = NO; 
    self.topSwitcher.showsVerticalScrollIndicator = NO; 

    [self add:3 ButtonsOnView:self.topSwitcher withButtonWidth:44.8f andHeight:20.0f]; 
} 

- (void)add:(int)num ButtonsOnView:(UIScrollView *)view withButtonWidth:(CGFloat)width andHeight:(CGFloat)height 
{ 
    CGFloat totalTopSwitcherWidth = num * width; 
    [view setContentSize:CGSizeMake(totalTopSwitcherWidth, view.bounds.size.height)]; 
    CGFloat xOffset = 0.0f; 

    for (int i=1; i<=num; i++) 
    { 
     UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     [button setFrame:CGRectMake(xOffset, 0, width, height)]; 
     xOffset += width; 
     [button setTitle:[NSString stringWithFormat:@"%d", i] forState:UIControlStateNormal]; 

     button.titleLabel.font = [UIFont systemFontOfSize:10]; 
     [button setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; 
     [button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected]; 
     [button setTag:i]; 
     [button addTarget:self action:@selector(buttonEvent) forControlEvents:UIControlEventTouchUpInside]; 

     if (i % 2 == 0) 
      [button setBackgroundColor:[UIColor yellowColor]]; 
     else 
      [button setBackgroundColor:[UIColor redColor]]; 

     [view addSubview:button]; 
    } 
} 
+0

Я изменяю '[самостоятельного дополнения: 3 ButtonsOnView: self.topSwitcher withButtonWidth: 44.8f andHeight: 20.0f] ; } 'to' [self add: 10 ButtonsOnView: self.topSwitcher withButtonWidth: 44.8f andHeight: 20.0f]; } ', затем распечатайте contentSize.width после' [view addSubview: button]; '. Правильно соответствует ContentSize.width = 448. Потому что каждая ширина кнопок составляет 44,8 и есть 10 кнопок. Но я не понимаю, почему scrollview все еще не прокручивается. Кроме того, я реализую функцию buttonEvent, которая просто печатает сообщение. Когда я нажимаю кнопку, журнал также не отображается. Думаю, я должен что-то упустить. –

ответ

4

Ниже следующие строки

[view addSubview:button]; 

добавить

view.contentSize = CGSizeMake(view.contentSize.width, button.frame.origin.y + button.frame.size.height); 

Это позволит установить размер контента зрения прокрутки в нижней части кнопки.

+0

Большое спасибо. Но после добавления кода он все равно не работает. Кстати, почему я не могу рассчитать и установить contentSize следующим образом: [view setContentSize: CGSizeMake (totalTopSwitcherWidth, view.bounds.size.height)]; Я думаю, что я просто вычисляю и устанавливаю достаточно contentSize, прежде чем добавлять кнопки в scrollview. –

+0

@PrestonCheung Вы добавляете только 3 кнопки в режиме прокрутки. Если да, то вы не сможете прокручивать. Вместо 3 попробуйте добавить 30 кнопок на просмотр прокрутки, и это сработает. Что здесь происходит, так это то, что размер содержимого прокрутки topSwitcher меньше его границ, поэтому он не прокручивается. –

+0

Да, вы правы! Если я добавлю только 3 кнопки, они не прокручиваются, но если я добавлю 30 кнопок, это нормально работает. –

0

Где вы добавить Scrollview на SuperView? И где вы пересчитываете свойство размера содержимого scrollView?

[view setContentSize:CGSizeMake(<summYourViews.width>,<summYourViews.height>)]; 
+0

И, возможно, убедитесь, что contentView больше, чем кадр, иначе он теперь может прокручивать, потому что больше ничего не показывать? –

+0

Да мб. в методе didLoad нам нужно добавить [self.topSwitcher setFrame: self.view.bounds] для получения fullScrenSuperViewRect – Bimawa

+0

Lol habit CamelHumps – Bimawa

1

Он должен быть вопрос о размере содержания, а также проверить, что scrollEnabled свойство объекта UIScrollView установлено значение TRUE,

Проверить решение UIScrollView won't scroll!

0

Ваша проблема в том, что вы не установили contentSize, поэтому contentSize совпадает с представлением кадра.

Вы должны сделать это в viewDidLoad

- (void)viewDidLoad { 
    ........ 
    self.scrollView.contentSize = CGSizeMake(/*yourWidth*/, /*yourHeight/*); 
    ........ 
} 

Try ли настроить свой contentSize до последней позиции вашего объекта плюс его размер плюс дополнения.

0

Вам необходимо установить размер и размер содержимого прокрутки.

+0

Я установил размер кадра scrollView 'self.topSwitcher = [[UIScrollView alloc] initWithFrame: CGRectMake (0, LABEL_HEIGHT + VIEW_Y, self.view.bounds.size.width, TOP_SWITCHER_HEIGHT)];' и размер содержимого '[view setContentSize : CGSizeMake (totalTopSwitcherWidth, view.bounds.size.height)]; '. Но это не сработает. –

+0

Размер контента и размер кадра не могут быть одинаковыми, размер содержимого должен быть больше размера кадра. – Pravin

0

попробуйте это. , , ,

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.topSwitcher = [[UIScrollView alloc] initWithFrame:CGRectMake(0, LABEL_HEIGHT + VIEW_Y, self.view.bounds.size.width, TOP_SWITCHER_HEIGHT)]; 
    self.topSwitcher.backgroundColor = [UIColor greenColor]; 
    self.topSwitcher.pagingEnabled = YES; 
    self.topSwitcher.showsHorizontalScrollIndicator = NO; 
    self.topSwitcher.showsVerticalScrollIndicator = NO; 
    [topSwitcher setContentSize:CGPointMake(self.view.bounds.size.width,TOP_SWITCHER_HEIGHT+400)]; 

    [self add:3 ButtonsOnView:self.topSwitcher withButtonWidth:44.8f andHeight:20.0f]; 
} 
0

Это потрясающе.

Я просто переместил коды, которые были в viewDidLoad, в initWithFrame :, затем он работает. Я не знаю, почему это так?

1

Просто отключите «Автомат макета» в своем проекте, и он начнет работать!

+0

Это сработало для меня. Благодаря! – quantumpotato

+0

Просто отключите его на xib, где это не нужно, и оставьте его включенным, когда вам действительно нужно настроить макет во время выполнения. – Massimo

0

Я использую Xcode 6/iOS 8+ теперь с включенной автоматической компоновкой, и у меня была такая же проблема, в первую очередь, удаление автоматической компоновки вообще не работает, поэтому, чтобы сделать прокрутку смотреть прокручивать вертикально, я убедился в следующем:

  1. свиток высота размер просмотр контента должен быть больше, чем высота экрана , это почти само собой разумеется ...

  2. Верхних/нижнее/левое/правое ограничение представления прокрутки ДОЛЖНО БЫТЬ возлагали, я сделал это с помощью раскадровки так кода не появляется здесь

Если вы хотите, чтобы сделать вид прокрутки прокручиваемым по горизонтали, затем убедитесь, что ширина его содержимого больше ширины экрана, другое правило применяется одинаково.

Это сработало для меня, надеюсь, что это может помочь кому-то.

1

Объединяя все это советуют в один простой ответ:

// В viewDidLoad

// set the size of the scrollview (in this case I made it the size of its container 
self.scrollView.frame = self.view.frame; 
// now set the size of the content to be scrolled within the scrollview 
// the content to be displayed must be bigger than the scrollView 
// in this case I added 100 to make the content size, so that it is taller than the height of the scrollView 
// now it scrolls 
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, self.scrollView.frame.size.height + 100); 
Смежные вопросы