gpt4 book ai didi

objective-c - 如何向 UIScrollView 添加 View 并使其与 UIPageControl 保持同步?

转载 作者:搜寻专家 更新时间:2023-10-30 19:53:28 25 4
gpt4 key购买 nike

我需要在我的应用程序中动态创建一些 View 并再次动态地在它们上面放置一些按钮。如果按钮的数量(计数)超过十个,我想将按钮放在新 View 上,并且 View 之间的转换必须使用 UIPageControl。尽管我在 Apple 的开发者页面上进行了谷歌搜索,但我找不到解决问题的方法。有人可以帮忙吗?

最佳答案

使用 addSubview 方法将您的 View 添加为 UIScrollView 的并排 subview 。然后将 UIPageControl 与 UIScrollView 一起使用,如 example 中所示.


我创建了一个管理 UIScrollView、UIPageControl 和 UIView 数组的类。它是我在自己的代码中使用的简化版本。它执行以下操作:

  • 设置 ScrollView 以显示一组 UIView。它不关心 View 是否动态生成。
  • 处理滚动和页面控制事件。
  • 将 ScrollView 与页面控件同步。

PageViewManager.h

#import <Foundation/Foundation.h>

@interface PageViewManager : NSObject <UIScrollViewDelegate>
{
UIScrollView* scrollView_;
UIPageControl* pageControl_;
NSArray* pages_;
BOOL pageControlUsed_;
NSInteger pageIndex_;
}

- (id)initWithScrollView:(UIScrollView*)scrollView
pageControl:(UIPageControl*)pageControl;
- (void)loadPages:(NSArray*)pages;
- (void)loadControllerViews:(NSArray*)pageControllers;

@end

PageViewManager.m

#import "PageViewManager.h"

@interface PageViewManager ()

- (void)pageControlChanged;

@end

@implementation PageViewManager

- (id)initWithScrollView:(UIScrollView*)scrollView
pageControl:(UIPageControl*)pageControl
{
self = [super init];
if (self)
{
scrollView_ = scrollView;
pageControl_ = pageControl;
pageControlUsed_ = NO;
pageIndex_ = 0;

[pageControl_ addTarget:self action:@selector(pageControlChanged)
forControlEvents:UIControlEventValueChanged];
}
return self;
}

/* Setup the PageViewManager with an array of UIViews. */
- (void)loadPages:(NSArray*)pages
{
pages_ = pages;
scrollView_.delegate = self;
pageControl_.numberOfPages = [pages count];

CGFloat pageWidth = scrollView_.frame.size.width;
CGFloat pageHeight = scrollView_.frame.size.height;

scrollView_.pagingEnabled = YES;
scrollView_.contentSize = CGSizeMake(pageWidth*[pages_ count], pageHeight);
scrollView_.scrollsToTop = NO;
scrollView_.delaysContentTouches = NO;

[pages_ enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop)
{
UIView* page = obj;
page.frame = CGRectMake(pageWidth * index, 0,
pageWidth, pageHeight);
[scrollView_ addSubview:page];
}];
}

/* Setup the PageViewManager with an array of UIViewControllers. */
- (void)loadControllerViews:(NSArray*)pageControllers
{
NSMutableArray* pages = [NSMutableArray arrayWithCapacity:
pageControllers.count];
[pageControllers enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop)
{
UIViewController* controller = obj;
[pages addObject:controller.view];
}];

[self loadPages:pages];
}

- (void)pageControlChanged
{
pageIndex_ = pageControl_.currentPage;

// Set the boolean used when scrolls originate from the page control.
pageControlUsed_ = YES;

// Update the scroll view to the appropriate page
CGFloat pageWidth = scrollView_.frame.size.width;
CGFloat pageHeight = scrollView_.frame.size.height;
CGRect rect = CGRectMake(pageWidth * pageIndex_, 0, pageWidth, pageHeight);
[scrollView_ scrollRectToVisible:rect animated:YES];
}

- (void)scrollViewDidScroll:(UIScrollView*)sender
{
// If the scroll was initiated from the page control, do nothing.
if (!pageControlUsed_)
{
/* Switch the page control when more than 50% of the previous/next
page is visible. */
CGFloat pageWidth = scrollView_.frame.size.width;
CGFloat xOffset = scrollView_.contentOffset.x;
int index = floor((xOffset - pageWidth/2) / pageWidth) + 1;
if (index != pageIndex_)
{
pageIndex_ = index;
pageControl_.currentPage = index;
}
}
}

- (void)scrollViewWillBeginDragging:(UIScrollView*)scrollView
{
pageControlUsed_ = NO;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
{
pageControlUsed_ = NO;
}

@end

要使用此类,您将其嵌入到包含 UIScrollView 和 UIPageControl 的 UIViewController 中。

用法:

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

// Create some views dynamically
UIView* v1 = ...
UIView* v2 = ...

// Put the views inside an NSArray:
NSArray* pages_ = [NSArray arrayWithObjects:v1, v2, nil];

/* Create the PageViewManager, which is a member (or property) of this
UIViewController. The UIScrollView and UIPageControl belong to this
UIViewController, but we're letting the PageViewManager manage them for us. */
pageViewManager_ = [[PageViewManager alloc]
initWithScrollView:self.scrollView
pageControl:self.pageControl];

// Make the PageViewManager display our array of UIViews on the UIScrollView.
[pageViewManager_ loadViews:pages_];
}

我的示例代码假定您使用的是 ARC。

关于objective-c - 如何向 UIScrollView 添加 View 并使其与 UIPageControl 保持同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9057462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com