小编Ang*_*qui的帖子

UIScrollView内的UITableView在滚动后没有收到第一次点击

简要

我在UITableView内心问题UIScrollView.当我滚动外部时scrollView,第一次触摸时table不会收到willSelect/didSelect事件,但第二次触摸时不会收到事件.更奇怪的是,细胞本身会得到触摸和突出显示的状态,即使delegate没有.

详细解释

我的视图层次结构

UIView
  - UIScrollView  (outerscroll)
      - Some other views and buttons
      - UITableView (tableView)
Run Code Online (Sandbox Code Playgroud)

在滚动视图中,我有一些额外的视图可以动态扩展/关闭.表格视图需要与视图中的其他一些元素一起"固定"在顶部,这就是我创建此布局的原因,这使我可以通过使用转换以类似于Apple推荐的方式轻松移动元素.滚动发生了.

当outerscroll像这样移动时,表视图将使用转换效果进行转换:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == self.outerScrollView) {

        CGFloat tableOffset = scrollView.contentOffset.y - self.fixedHeaderFrame.origin.y;
        if (tableOffset > 0) {
            self.tableView.contentOffset = CGPointMake(0, tableOffset);
            self.tableView.transform = CGAffineTransformMakeTranslation(0, tableOffset);
        }
        else {
            self.tableView.contentOffset = CGPointMake(0, 0);
            self.tableView.transform = CGAffineTransformIdentity;
        }

        // Other similar transformations are done here, but not involving …
Run Code Online (Sandbox Code Playgroud)

objective-c uitableview uiscrollview ios

31
推荐指数
4
解决办法
3万
查看次数

NSURLCache缓存不应缓存的随机响应

我正在实现一个应用程序,它可以对我们也控制的rest-api进行大量的网络调用.最近我们决定在服务器端引入缓存头,以节省一些宝贵的网络和服务器时间.由于我们事先不知道数据有效的时间长短,我们不是发送Cache-control: max-ageExpires标题,我们所做的只是发送一个Last-Modified标题和a E-tag,所以我们总是点击服务器,但响应速度非常快,大部分时间都是304.一开始似乎一切正常,许多请求都被缓存了.但是,由于缓存,在应用程序上遇到一些随机数据错误.

出于某种原因,我无法理解,在某些时候,请求被本地缓存并且在没有命中服务器的情况下被用作"更新"数据,而实际上并非如此.问题一直存在,直到一段时间过去.然后一切都正常地再次进入服务器,就像它使用cache-control标题一样,但没有它!所以,我的问题是:


如何能NSURLCache一起NSURLConnection决定某个特定请求不需要去上网时,原来的请求没有附带Cache-control: max-ageExpires头?有谁经历过类似的影响?如何在不删除整个缓存的情况下解决它?


更多背景信息:

  • 我正在使用AFNetworking,但它依赖于NSURLConnection所以我认为它不会改变任何东西
  • 使用的缓存是默认[NSURLCache sharedURLCache]实例
  • 这是一个GET请求,当我从缓存的响应中检查标头时,这就是我得到的:

    po [response allHeaderFields]

    "Access-Control-Allow-Headers" = "Content-Type";
    "Access-Control-Allow-Methods" = "GET, POST, DELETE, PUT";
    "Access-Control-Allow-Origin" = "*";
    Connection = "keep-alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 522;
    "Content-Type" = "application/json";
    Date = "Mon, 02 Sep 2013 08:00:38 GMT";
    Etag …
    Run Code Online (Sandbox Code Playgroud)

caching nsurlconnection nsurlcache ios afnetworking

7
推荐指数
1
解决办法
1718
查看次数

在Swift协议中,IBActions的更好策略是什么?

我正在创建一个Swift项目,我想定义一个特定的协议来强制其他组件来实现一个animate方法:

protocol AnimatableBehavior {
    @IBAction func animate()
}
Run Code Online (Sandbox Code Playgroud)

问题是我希望这个方法是一个IBAction,但我从XCode得到这个错误:

只有实例方法可以声明'IBAction'

我的问题是,你将如何实现这样的事情?

我考虑过:

  1. 删除@IBAction,但后来我需要记住在每个实现的类中添加它.不是很优雅,容易出错.
  2. 创建一个基类而不是协议,但后来我强制所有组件继承我的基类而不是他们自己选择的基类,所以它不是一个有效的选项.

还有其他想法吗?


编辑:回复以下评论.

IBAction关于协议的想法是因为在项目中将有许多不同的开发人员实现小的UI组件,所有这些组件都具有animate方法.这些组件可以通过编程方式添加,也可以通过Interface Builder添加,它们总是非常方便,IBAction因为我打算从IB文件中组合它们以最大限度地简化视图控制器(这显然是一个仅查看任务).

因此,下面提出的在控制器中添加一个只调用animate组件的方法的解决方案并不好,因为它是冗余代码并使Controller更依赖于View.

让开发人员记住IBAction在方法上添加关键字的想法是可行的,但正如我所说它容易出错(并且我的意思是会有一些遗忘),我想确保这是总是可以从IB访问.它还增加了额外的认知负荷,因为我需要记录IBAction协议的缺失并请求实现者手动添加它.

我知道这不是在iOS中工作的常见方式UIKit,但这就是我发布问题的原因,也许有人有另一种想法.

protocols ibaction ios swift swift-protocols

7
推荐指数
1
解决办法
3298
查看次数

自定义标签栏(如带透明胶片的容器视图)不会设置底部布局指南

我想创建一个自定义容器视图控制器,其行为与半透明tabbar非常相似.在我的故事板中,我有这样的事情:

带有容器视图的故事板[1]

问题

容器视图中的内容在tabbar按钮视图下展开,以显示半透明效果.但是,因为这不是标准的tabbar,UIKit所以没有bottomLayoutGuide在子控制器中设置,默认情况下0.

结果是,当存在滚动视图时,内部子控制器没有在内容上正确设置插入,因此内容的最后几个像素被tababar视图覆盖.

脏的解决方案

我知道我可以制作一个自定义解决方案,我contentInset在子视图控制器中手动更改,但这将是非常麻烦,因为有多个孩子.此外,这个自定义tabbar将动画输入/输出,并且可能具有不同的大小,因此这种方法非常复杂,并且与子控制器的关系非常紧密地与自定义tabbar实现相关联.从子项到tabbar布局的许多额外代码和依赖项!

我想要实现的目标

如果我使用标准标签栏,内容将正确显示,因为系统使用bottomLayoutGuide向内部滚动框添加插入内容.

我想以某种方式执行与我的自定义标签栏同样的动作,所以没有必要改变任何东西在我的孩子控制器代码(让他们更少地依赖于标签栏的内部),所以我可以引用布局边距通常来自InterfaceBuilder,无论哪个是容器视图.

作为额外的好处,这种方法可以让我更改bottomLayoutGuide动画输入/输出或更改标签栏大小,并只需要再次询问子视图.

我试过了什么

bottomLayoutGuide在tabBar和子控制器上尝试了不同的操作.我尝试过的一些例子是:

bottomLayoutGuide.heightAnchor.constraintEqualToConstant(40) bottomLayoutGuide.topAnchor.constraintEqualToAnchor(tabBarView.topAnchor)

而且我也试着打电话view.setNeedsUpdateConstraints()以防万一,但不管我做什么bottomLayoutGuide.length似乎总是回来0.0.

我也看到现在的观点有一个,layoutMarginsGuide但似乎并不是一回事.

问题

  • 为什么bottomLayoutGuide总是0?我在这里错过了什么吗?
  • 有谁知道如何以优雅的方式解决这个问题?任何其他干净的方法来解决问题?

谢谢!

uiviewcontroller uikit ios autolayout

7
推荐指数
0
解决办法
217
查看次数