- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个主视图 Controller ,它有一个 UIScrollView 的 subview 和另外 2 个 UIViewController(每个都有 nibs UIView 和按钮)。使用 addSubView 方法将 UIViewControllers 的 UIView 添加到 UIScrollView 中。我想并排放置两个 UIViewController。
我有以下代码,但它似乎不起作用。
[self scrollView].pagingEnabled = YES;
[self scrollView].contentSize = CGSizeMake(768 * 2, 1024);
[[self scrollView] setDelegate:self];
CGRect frame1;
frame1.origin.x = 0;
frame1.origin.y = 0;
frame1.size = CGSizeMake(768, 1024);
// Model one
oneView = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil];
//oneView.view.frame = frame1;
[self.scrollView addSubview:oneView.view];
oneView.view.frame = frame1;
// Model two
CGRect frame2;
frame2.origin.x = 768;
frame2.origin.y = 0;
frame2.size = CGSizeMake(768, 1024);
twoView = [[TwoViewController alloc] initWithNibName:@"TwoViewController" bundle:nil];
//twoView.view.frame = frame2;
[self.scrollView addSubview:twoView.view];
twoView.view.frame = frame2;
为什么当我设置了它们的 frame.origin.x 后,UIScrollView 中的 oneView 和 twoView 在同一个地方? twoView 似乎在 oneView 之上,应该并排放置?知道我哪里做错了吗?谢谢!
更新:这是我在github上的完整项目代码:http://bit.ly/PLe1Le
最佳答案
这开始发生的原因是任何作为 UIViewController
的 view
属性值的 UIView
实例有时会得到一个消息将其 View 调整为其父 View 的大小。
具体来说,未记录的方法 viewDidMoveToWindow:shouldAppearOrDisappear:
将在将 View Controller 的 view
添加到窗口时调用,如本例中应用程序启动时所发生的那样。此时,如果 View Controller 的 view
实例是主窗口的大小或更大,它将被调整到它的父 View 的大小。
原始代码采用从 .xibs 加载的两个 View 并将它们的大小调整为 768 * 1024,这是窗口的大小。这发生在之前 -makeKeyAndVisible
在窗口上调用,最终触发调整大小。我在应用程序委托(delegate)中使用了 KVO 来观察帧的大小调整;这是调整大小时的堆栈跟踪:
* thread #1: tid = 0x1f03, 0x000030f9 scroller`-[ViewController observeValueForKeyPath:ofObject:change:context:] + 105 at ViewController.m:71, stop reason = breakpoint 1.1
frame #0: 0x000030f9 scroller`-[ViewController observeValueForKeyPath:ofObject:change:context:] + 105 at ViewController.m:71
frame #1: 0x0093ad91 Foundation`NSKeyValueNotifyObserver + 345
frame #2: 0x0093a895 Foundation`NSKeyValueDidChange + 438
frame #3: 0x0092033e Foundation`-[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:] + 131
frame #4: 0x009cdcb4 Foundation`_NSSetRectValueAndNotify + 187
frame #5: 0x000e1786 UIKit`-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:] + 657
frame #6: 0x0005310c UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 1040
frame #7: 0x00052edb UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 479
frame #8: 0x0005d5ab UIKit`-[UIScrollView _didMoveFromWindow:toWindow:] + 65
frame #9: 0x00052edb UIKit`-[UIView(Internal) _didMoveFromWindow:toWindow:] + 479
frame #10: 0x0004f692 UIKit`-[UIView(Hierarchy) _postMovedFromSuperview:] + 158
frame #11: 0x0005446f UIKit`-[UIView(Internal) _addSubview:positioned:relativeTo:] + 1633
frame #12: 0x0004e14b UIKit`-[UIView(Hierarchy) addSubview:] + 56
frame #13: 0x0003d550 UIKit`-[UIWindow addRootViewControllerViewIfPossible] + 380
frame #14: 0x0003d670 UIKit`-[UIWindow _setHidden:forced:] + 280
frame #15: 0x0003d836 UIKit`-[UIWindow _orderFrontWithoutMakingKey] + 49
frame #16: 0x0004472a UIKit`-[UIWindow makeKeyAndVisible] + 35
frame #17: 0x00002575 scroller`-[AppDelegate application:didFinishLaunchingWithOptions:] + 661 at AppDelegate.m:21
frame #18: 0x00015386 UIKit`-[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1292
frame #19: 0x00016274 UIKit`-[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 524
frame #20: 0x00025183 UIKit`-[UIApplication handleEvent:withNewEvent:] + 1027
frame #21: 0x00025c38 UIKit`-[UIApplication sendEvent:] + 68
frame #22: 0x00019634 UIKit`_UIApplicationHandleEvent + 8196
frame #23: 0x0139eef5 GraphicsServices`PurpleEventCallback + 1274
frame #24: 0x01488195 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
frame #25: 0x013ecff2 CoreFoundation`__CFRunLoopDoSource1 + 146
frame #26: 0x013eb8da CoreFoundation`__CFRunLoopRun + 2218
frame #27: 0x013ead84 CoreFoundation`CFRunLoopRunSpecific + 212
frame #28: 0x013eac9b CoreFoundation`CFRunLoopRunInMode + 123
frame #29: 0x00015c65 UIKit`-[UIApplication _run] + 576
frame #30: 0x00017626 UIKit`UIApplicationMain + 1163
frame #31: 0x000022ad scroller`main + 141 at main.m:16
我们可以通过实例化 View 并将其同时添加到 ScrollView 来验证是否发生这种情况,因为内容 View 是 UIViewController
的 View 实例。我将以下代码添加到 ViewController
的 viewDidLoad
实现的末尾:
CGRect frame3 = frame2;
frame3.origin.x = 768.0f * 2.0f;
UIView *thirdView = [[UIView alloc] initWithFrame:frame3];
[thirdView setBackgroundColor:[UIColor redColor]];
[self.scrollView addSubview:thirdView];
以及更改将内容大小分配给的行:
[self scrollView].contentSize = CGSizeMake(768 * 3, 1024);
此 View 在 makeKeyAndVisible
期间未设置其框架,但位于正确的位置。
要解决此问题,我建议在窗口调用 -makeKeyAndVisible
后设置 View 层次结构,可能在 viewWillAppear 中(不确定是否会有相同的问题)或通过否则构造您的代码以延迟 ScrollView 的布局。或者,稍后重新设置帧作为此错误的显式撤消。
我希望这有助于解释发生的事情,并且我提供的证据是清晰可信的;看起来您已经针对您的特定情况进行了修复,但希望当 UIViewController
的 View 在 ScrollView 中布局时,这个答案可以作为框架错误行为的一般解决方案。
关于ios - 在 UIScrollView 中并排定位 UIViewControllers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12103677/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!