2010-10-27 2 views
0

У меня полноэкранный просмотр UIScrollview (B) в полноэкранном UIScrollview (A).Проблема: UIScrollview bouncing делает родительский UIScrollview подпрыгивая

  • А имеет contentsize = номер страницы Горизонтально

  • В имеет contentsize = количество Subpage вертикально

  • Внутри B, у меня есть небольшой UIScrollView (C), что прокрутки в в том же направлении, что и B ... Так же вертикально.

Когда C дико прокручивается, он создает сильный эффект подпрыгивания при достижении конца contentSize.

проблема: ЭТО СОЗДАЕТ ТАКЖЕ БУНКЕР ЭФФЕТ НА Б !!!! есть ли способ подавить это загрязнение эффекта отскока между родителями и детьми, не подавляя эффект отскока обоих.

Thanks

+0

- ваш палец вне C (например, в B), когда он начинает подпрыгивать? – boreas

+0

движение начинается с C, и да, палец находится вне C, когда он начинает отскакивать. Зачем ? – xeonarno

ответ

1

Документация Apple предупреждает об аналогичных конструкциях. От the docs:

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

Я бы распространил это предупреждение на вложенные UIScrollViews по причинам, которые вы обнаружили.

Вы можете извлечь его из аналога вложенных A/B/C UIScrollViews, сделав примерно то, что делает браузер Safari для мобильных устройств. Пользователь находится либо в режиме «выбор веб-страницы» (ваши A & B), либо в режиме просмотра веб-страницы (вид C). Кнопка в пользовательском WebView-контроллере Safari позволяет пользователю перейти из режима просмотра веб-страницы в режим «выбор веб-страницы», который представляет собой UIScrollView с эскизами каждой из действующих в данный момент страниц.

Итак, в вашем случае это означало бы вытащить C из вложенных UIScrollViews, добавив кнопку в контроллер вида C, который представляет контроллер A & B, и, возможно, создаст еще один класс контроллера, чтобы склеить все это вместе.

Я также выступаю за объединение A & B в единый UIScrollView.

0

Согласно Apple iOS Scroll View Programming Guide сейчас ..

Чтобы создать богатый пользовательский опыт, вы можете вид гнездо прокрутки в вашем приложении. До iOS 3.0 было сложно, если не невозможно, выполнить это. В iOS 3.0 эта функциональность полностью поддерживается и работает автоматически.

Так гнездования scrollviews прекрасно подходит> IOS 3. Чтобы ответить на ваш вопрос, я добавил Scrollview C как подвид к «контейнер» UIView - перед тем, добавив, что вид контейнера Scrollview B. Кажется, чтобы остановить сильный удар, потянув прокрутка родительского прокрутки вниз, хотя мне приходилось пробираться довольно сильно и быстро, чтобы показать, как вы описали поведение без представления контейнера.

@interface TiledScrollView : UIScrollView @end 

@implementation TiledScrollView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if(self) 
    { 
     self.layer.borderColor = [UIColor whiteColor].CGColor; 
     self.layer.borderWidth = 10.f; 
    } 
    return self; 
} 

- (void)setContentSize:(CGSize)contentSize 
{ 
    [super setContentSize:contentSize]; 

    BOOL horizontal = contentSize.width > self.frame.size.width; 

    if(horizontal) 
    { 
     CGFloat col = self.contentSize.width/10.f; 
     for (int i = 0; i < 10; i++) 
     { 
      UIView * view = [[UIView alloc] initWithFrame:CGRectMake(i * col, 0, col, self.contentSize.height)]; 
      view.backgroundColor = [UIColor colorWithHue:(arc4random() % 100)/100.f saturation:1.f brightness:1.f alpha:1.f]; 
      [self addSubview:view]; 
     } 
    } 
    else 
    { 
     CGFloat row = self.contentSize.height/10.f; 
     for (int i = 0; i < 10; i++) 
     { 
      UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, i * row, self.contentSize.width, row)]; 
      view.backgroundColor = [UIColor colorWithHue:(arc4random() % 100)/100.f saturation:1.f brightness:1.f alpha:1.f]; 
      [self addSubview:view]; 
     } 
    } 
} 

@end 

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CGRect bounds = [UIScreen mainScreen].bounds; 
    TiledScrollView * A = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height)]; 
    TiledScrollView * B = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height/2.f)]; 
    TiledScrollView * C = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height/4.f)]; 

    [A setContentSize:CGSizeMake(bounds.size.width * 4, bounds.size.height)]; 
    [B setContentSize:CGSizeMake(bounds.size.width, bounds.size.height * 4)]; 
    [C setContentSize:CGSizeMake(bounds.size.width, bounds.size.height * 4)]; 

    UIView * container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height/4.f)]; 

    [container addSubview:C]; 
    [B addSubview:container]; 
    [A addSubview:B]; 
    [self.view addSubview:A]; 
} 

@end 
Смежные вопросы