重置 UIPageControl 将视图重置为原始状态

Posted

技术标签:

【中文标题】重置 UIPageControl 将视图重置为原始状态【英文标题】:Resetting UIPageControl Resets View To Original State 【发布时间】:2012-11-13 20:48:01 【问题描述】:

我有一个 iPad 视图,它有一个 ScrollView,在它下面我使用一个页面控制对象来显示它所在的页面。在屏幕的其他地方,我在上午 12:00 和上午 5:00 之间有一个时间线 - 随着时间的推移,时间轴顶部有一个 UIImage 变宽以指示一天中的时间。通过使用每分钟左右启动的 NSTimer,随着时间的推移,UIImage 变得越来越宽。

此外,我在页面上有 3 个按钮,它们将使用其中的一组新图像刷新 Scrollview。图片的数量可以在 3 到 7 之间变化。因此,当按下按钮时,我会更新滚动视图,并更新 Page Control 对象以将“numberOfPages”属性设置为适当的数字。

好的,所以问题似乎是每当我单击一个按钮并且 pageControl numberOfPages 发生更改时,UIImage 就会恢复到我最初在 Interface Builder(故事板)中设计它时的大小。

我创建了一个简化的示例项目,希望它足以重新创建行为...

ViewController.h:

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController 
@property (weak, nonatomic) IBOutlet UIButton *btnTest;
@property (weak, nonatomic) IBOutlet UIImageView *imgTest;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
- (IBAction)buttonPress:(id)sender;
@end

ViewController.m: #import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize imgTest,btnTest,pageControl;

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    // Set up an observer to handle updating the timeline
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(UpdateWidth:)
                                                 name:@"UpdateWidth" object:nil];


-(void)viewDidAppear:(BOOL)animated 
    // Send an updateTimeIndicator notification when screen loads.
    [[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateWidth" object:@"sent"];



- (void)didReceiveMemoryWarning

    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


- (IBAction)buttonPress:(id)sender 
    pageControl.numberOfPages = 7;
    pageControl.currentPage = 0;



-(void)UpdateWidth:(NSNotification *)notification
    [imgTest setFrame:CGRectMake([imgTest frame].origin.x, [imgTest frame].origin.y,
                                          450, [imgTest bounds].size.height)];

    imgTest.contentMode = UIViewContentModeScaleAspectFit; // This determines position of image
    imgTest.clipsToBounds = YES;
    [imgTest setNeedsDisplay];

    NSLog(@"Width Updated");

@end

因此,在此示例中,我在 Window 中只有 3 个对象 - PageControl、一个 Button 和一个背景设置为蓝色的 UIImage。我正在使用通知中心发送关于何时调整 UIImage 大小的消息(在这种情况下,我只做一次,当视图出现时)。 updateWidth 例程将 UIImage 的大小调整为 450 像素宽,并且视图按原样显示。

但是,点击按钮会改变 numberOfPages 的值,并且这样做会将 UIImageView 设置回它最初在 Interface Builder 中布局时的大小。

如果有人想看的话,我确实有一个压缩的项目文件。另外,我确实在不使用通知中心的情况下尝试了这个,结果是一样的(我最初没有使用通知中心,只是认为它可能会给出不同的结果)。

我可能不使用 PageControl 对象也能过得去,但我现在很好奇为什么会这样。谢谢!

【问题讨论】:

我不明白这个问题:(你能把压缩后的项目发给我吗? omarfraiwan@gmail.com? 已发送电子邮件 - 谢谢!这是一个在没有实际看到的情况下很难解释的问题。我希望有一种方法可以在 *** 中附加项目文件。 【参考方案1】:

我似乎通过将 ScrollView 和 PageControl 对象都放入它们自己的(新)UIView 中解决了这个问题。为此,我在界面生成器中打开了故事板,将工具箱中的 View 对象拖到界面窗口中,然后将现有的 ScrollView 和 PageControl 对象都放入新的 UIView 中。之后,更改 PageControl 的 numberOfPages 属性不会影响窗口上的任何其他内容。

我仍然对这种行为感到困惑。我猜是因为一旦页面控件被放置在新视图中并且问题停止了,PageControl 想要在 numberOfPages 属性更改时更新它所在的整个视图。

【讨论】:

以上是关于重置 UIPageControl 将视图重置为原始状态的主要内容,如果未能解决你的问题,请参考以下文章

Swift - UIBarButtonItem.customView - 重置为原始状态

Android Studio - 选项卡式活动如何将片段重置为默认视图?

将 UIViewController 子视图重置回初始位置

Confluence 6 为空白空间重置原始默认内容

将var重置为原始状态

SwiftUI 确认按钮 - 在任何其他视图交互时重置状态