gpt4 book ai didi

ios - UIPageViewController/TextKit 在分页上重排文本

转载 作者:可可西里 更新时间:2023-11-01 05:44:18 31 4
gpt4 key购买 nike

我正在开发一个由 TextKit 支持的多页阅读应用程序,该应用程序基于 WWDC 2013 的“高级文本布局和文本工具包效果” session (但一些代码是根据不完整的示例重建的)。基本结构是预先计算文本所需的页面数,然后为每个页面创建一个 NSTextContainer 并将其添加到 NSLayoutManager。每当 UIPageViewController 请求下一页或上一页时,您都会创建一个新的 UITextView 并通过从 NLayoutManger 的 NSTextContainers 数组中选择正确的一个来设置其背景文本容器。

不幸的是,我遇到了一个问题,即文本在第一页和我第一次翻页返回任何给定页面时都会重排。这是它的样子:

animation of reflowing text

这不是最明显的效果(如果你错过了,翻页时注意屏幕顶部),但它有点让人迷惑,如果可能我想消除它。鉴于文本容器应该预先计算,我不明白为什么它会重排文本,或者如何防止它。有谁知道问题出在哪里?

编辑:添加代码示例。

@interface ReaderViewController () <UIPageViewControllerDataSource>

@property (nonatomic, assign) NSUInteger numberOfPages;

@property (nonatomic, retain) UIPageViewController *pageViewController;
@property (nonatomic, retain) NSTextStorage *currentDocument;
@property (nonatomic, retain) NSLayoutManager *layoutManager;

@end

@implementation ReaderViewController

- (instancetype)initWithDocument:(NSTextStorage *)document {
if ((self = [super init])) {
_currentDocument = document;
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];

_layoutManager = [[NSLayoutManager alloc] init];
[self.layoutManager setTextStorage:self.currentDocument];
self.layoutManager.delegate = self;

_pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
options:nil];
self.pageViewController.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
self.pageViewController.dataSource = self;
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];

// the numberOfPages accessor lazily calculates the number of pages needed to contain the document
for (int i = 0; i < self.numberOfPages; ++i) {
NSTextContainer *container = [[NSTextContainer alloc] init];
container.size = [self _textFrame].size;
[self.layoutManager addTextContainer:container];
}

[self.pageViewController setViewControllers:@[[self viewControllerForPageNumber:0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}

- (UIViewController *)viewControllerForPageNumber:(NSUInteger)pageNumber {
if (pageNumber >= self.numberOfPages) {
return nil;
}

// SinglePageViewController is a lightweight view controller that has a UITextView and a page number
SinglePageViewController *vc = [[SinglePageViewController alloc] init];

UITextView *textView = [[UITextView alloc] initWithFrame:[self _textFrame] textContainer:[self.layoutManager.textContainers objectAtIndex:pageNumber]];
textView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
textView.scrollEnabled = NO;
textView.editable = NO;
[textView setFont:[UIFont fontWithName:@"IowanOldStyle-Roman" size:20.f]];
[vc.view addSubview:textView];

vc.textView = textView;
vc.pageNumber = pageNumber;

return vc;
}

#pragma mark - UIPageViewControllerDataSource

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger currentPage = [(SinglePageViewController *)viewController pageNumber];
if (currentPage >= self.numberOfPages) {
return nil;
}

return [self viewControllerForPageNumber:currentPage + 1];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger currentPage = [(SinglePageViewController *)viewController pageNumber];
if (currentPage == 0) {
return nil;
}

return [self viewControllerForPageNumber:currentPage - 1];
}

#pragma mark - Private

- (CGRect)_textFrame {
return CGRectInset(self.view.bounds, 5., 0.);
}

@end

最佳答案

我遇到了同样的问题。我的解决方案是将 scrollEnabled 放在 addSubview 之后,将强制 textContainer 重新计算大小。见以下代码:

vc.view.addSubview(textView)
textView.scrollEnabled = false;

更新。最后,我想我找到了正确的答案......我们需要在 didChangeGeometryFromSize 回调中重置容器大小。如果不正确请纠正我:)

func layoutManager(layoutManager: NSLayoutManager, 
textContainer: NSTextContainer,
didChangeGeometryFromSize oldSize: CGSize) {

textContainer.size = self.textFrame().size;
println(textContainer.size.width)
println(textContainer.size.height)
}

关于ios - UIPageViewController/TextKit 在分页上重排文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24710845/

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