我在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) 我正在实现一个应用程序,它可以对我们也控制的rest-api进行大量的网络调用.最近我们决定在服务器端引入缓存头,以节省一些宝贵的网络和服务器时间.由于我们事先不知道数据有效的时间长短,我们不是发送Cache-control: max-age或Expires标题,我们所做的只是发送一个Last-Modified标题和a E-tag,所以我们总是点击服务器,但响应速度非常快,大部分时间都是304.一开始似乎一切正常,许多请求都被缓存了.但是,由于缓存,我在应用程序上遇到一些随机数据错误.
出于某种原因,我无法理解,在某些时候,请求被本地缓存并且在没有命中服务器的情况下被用作"更新"数据,而实际上并非如此.问题一直存在,直到一段时间过去.然后一切都正常地再次进入服务器,就像它使用cache-control标题一样,但没有它!所以,我的问题是:
如何能NSURLCache一起NSURLConnection决定某个特定请求不需要去上网时,原来的请求没有附带Cache-control: max-age或Expires头?有谁经历过类似的影响?如何在不删除整个缓存的情况下解决它?
更多背景信息:
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)我正在创建一个Swift项目,我想定义一个特定的协议来强制其他组件来实现一个animate方法:
protocol AnimatableBehavior {
@IBAction func animate()
}
Run Code Online (Sandbox Code Playgroud)
问题是我希望这个方法是一个IBAction,但我从XCode得到这个错误:
只有实例方法可以声明'IBAction'
我的问题是,你将如何实现这样的事情?
我考虑过:
@IBAction,但后来我需要记住在每个实现的类中添加它.不是很优雅,容易出错.还有其他想法吗?
编辑:回复以下评论.
IBAction关于协议的想法是因为在项目中将有许多不同的开发人员实现小的UI组件,所有这些组件都具有animate方法.这些组件可以通过编程方式添加,也可以通过Interface Builder添加,它们总是非常方便,IBAction因为我打算从IB文件中组合它们以最大限度地简化视图控制器(这显然是一个仅查看任务).
因此,下面提出的在控制器中添加一个只调用animate组件的方法的解决方案并不好,因为它是冗余代码并使Controller更依赖于View.
让开发人员记住IBAction在方法上添加关键字的想法是可行的,但正如我所说它容易出错(并且我的意思是会有一些遗忘),我想确保这是总是可以从IB访问.它还增加了额外的认知负荷,因为我需要记录IBAction协议的缺失并请求实现者手动添加它.
我知道这不是在iOS中工作的常见方式UIKit,但这就是我发布问题的原因,也许有人有另一种想法.
我想创建一个自定义容器视图控制器,其行为与半透明tabbar非常相似.在我的故事板中,我有这样的事情:
![带有容器视图的故事板[1]](https://i.stack.imgur.com/99XbK.png)
容器视图中的内容在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?我在这里错过了什么吗?谢谢!
ios ×4
afnetworking ×1
autolayout ×1
caching ×1
ibaction ×1
nsurlcache ×1
objective-c ×1
protocols ×1
swift ×1
uikit ×1
uiscrollview ×1
uitableview ×1