jjzjj

objective-c - GMGridView 出现在屏幕外,但与屏幕 View 重叠

coder 2024-01-21 原文

我正在使用自定义 Controller 进行转换(由于项目中的固有循环,无法使用导航 Controller ,这将允许导航 Controller 堆栈无限增长 [我认为这会导致内存问题])​​。我正在使用 UIView animateWithDuration:animations:completion:

模拟导航 Controller 滑动动画(当转换到新屏幕时)

当按下触发转换的按钮时,我要转换到的新 View 的框架被设置到屏幕外位置。在过渡动画 (UIView animateWithDuration:animations:completion:) 中,当前屏幕上的 View 将其框架设置为屏幕外位置,新 View 设置为屏幕上位置。

这是在我的自定义过渡 Controller 中:

CGFloat windowWidth = self.mainView.frame.size.width;
CGFloat windowHeight = self.mainView.frame.size.height;
CGRect offScreenLeft = CGRectMake(-1*windowWidth, 0.0, windowWidth, windowHeight);
CGRect onScreen = self.mainView.frame;
CGRect offScreenRight =  CGRectMake(windowWidth, 0.0, windowWidth, windowHeight);


if (direction == TransitionDirectionForward)
{
    if (dragBackgroundOnscreen){
        [self.mainView addSubview:self.backgroundView];
        [self.mainView sendSubviewToBack:self.backgroundView];
        self.backgroundView.frame = offScreenRight;
    } 


    self.currentViewController.view.frame = offScreenRight;

    [UIView animateWithDuration:0.65
                     animations:^{
                         oldViewController.view.frame = offScreenLeft;
                         if (dragBackgroundOffscreen)
                             self.backgroundView.frame = offScreenLeft;
                         else if (dragBackgroundOnscreen)
                             self.backgroundView.frame = onScreen;

                         self.currentViewController.view.frame = onScreen;
                     }
                     completion:^(BOOL finished){
                         [oldViewController.view removeFromSuperview];  
                         if (dragBackgroundOffscreen)
                             [self.backgroundView removeFromSuperview];
                         [oldViewController willMoveToParentViewController:nil];
                         [oldViewController removeFromParentViewController];
                         [self.currentViewController didMoveToParentViewController:self]; 
                     }];


}
else if (direction == TransitionDirectionBackward)
{
    if (dragBackgroundOnscreen){
        [self.mainView addSubview:self.backgroundView];
        [self.mainView sendSubviewToBack:self.backgroundView];
        self.backgroundView.frame = offScreenLeft;
    } 
    self.currentViewController.view.frame = offScreenLeft;
    [UIView animateWithDuration:0.65 
                     animations:^{
                         oldViewController.view.frame = offScreenRight;

                         if (dragBackgroundOffscreen)
                             self.backgroundView.frame = offScreenRight;
                         else if (dragBackgroundOnscreen)
                             self.backgroundView.frame = onScreen;

                         self.currentViewController.view.frame = onScreen;
                     }
                     completion:^(BOOL finished){
                         [oldViewController.view removeFromSuperview]; 
                         if (dragBackgroundOffscreen)
                             [self.backgroundView removeFromSuperview];
                         [oldViewController willMoveToParentViewController:nil];
                         [oldViewController removeFromParentViewController];
                         [self.currentViewController didMoveToParentViewController:self];
                     }];

} 

我还希望背景 (self.backgroundView) 保持静态,除非移动到具有自己背景的屏幕(即,如果新 View 背景是相同的背景,我不希望背景滑动)。

我使用 TransitionDirectionBackward 和 TransitionDirectionForward 只是为了区分向左滑动和向右滑动。

一切都很好,除非转换涉及 GMGridView。当 Gridviews 框架设置为屏幕外框架时的问题实际上是将其当前选定页面的框架设置为该屏幕外框架。 gridview 的其他页面不受此框架的限制,因此它们甚至可以在转换之前出现在屏幕上。我尝试在 GridView 的 viewcontroller View 上设置 frame 和 bounds 属性,但我仍然可以在过渡动画之前让 gridview 的页面出现在屏幕上。

有人看到这个问题的解决方案吗?我试图找到一种方法来在转换期间裁剪 GridView 的 View ,这样页面就不会出现,除了当前选定的页面,但还没有发现任何有用的东西。

更新:我通过为可见但不应该可见的单元格设置 alpha = 0.0 找到了一个可能的修复方法(稍后在过渡动画完成时设置 alpha = 1.0)。但是,我需要知道为哪些单元格执行此操作。我需要一种方法来访问 GMGridView 当前所在的页面,以便我可以将相邻页面的单元格设置为具有 0.0 的 alpha。

更新:通过使用 myGridView convertPoint 找到了使其工作的方法:(我通过反复试验发现的 cgpoint 位于页面的第一个单元格上。)fromView:myGridView.window。注意:我需要一个 if/else if 来检查我是在横向左侧还是横向右侧,因为当设备旋转时窗口坐标不会旋转。有了这个,我能够在我指定的屏幕上的点处获取单元格的索引,然后将前一页设置为透明,直到过渡动画结束。

我仍然想知道是否有一种“裁剪”gridview 的方法,以便单元格可以不透明,但永远不会显示......?

最佳答案

我想我把问题复杂化了。我一直在寻找 UIView 的 clipsToBounds 方法(尽管我可以发誓我之前尝试过)。无论如何,它现在可以工作了!

关于objective-c - GMGridView 出现在屏幕外,但与屏幕 View 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11264321/

有关objective-c - GMGridView 出现在屏幕外,但与屏幕 View 重叠的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  4. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  5. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  8. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  9. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  10. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

随机推荐