UIView,SegmentedController& ScrollView中的UIContainerView或类似的东西?
在我的故事板中,我有一个顶部有一个UIView的VC,中间有一个分段控制器。 2底部的ContainerViewControllers,嵌入了新VC的segue。
在新的VC中我有一个TableView& CollectionView(例如,Instagram个人资料)。
我的问题是我需要使用SegmentedController和UIView来滚动ContainerView(TableView / CollectionView),此时只有ContainerView部件滚动并且上面的部分是固定的。
现在我猜我可能需要将所有内容放入UIScrollView中,所以我尝试了这个&正确地放置了所有的成本。但是当它在Swift文件中进行配置时,我现在只是如何设置滚动的高度,但是我需要的高度显然可以变化并且不是固定的高度!
如果有人能在这里帮助我,那会非常棒,或者可能会指出我已经在这里提出的类似问题?我已经看了,但遗憾的是没找到任何东西!
下面的图片基本上解释了我之后的情况,如果上面我不是很清楚..
以下是您可以看到的示例:https://github.com/Jackksun/ScrollIssue
答案 0 :(得分:2)
据我了解,您希望滚动视图在其范围之外接收触摸。您可以通过覆盖实际接收触摸的视图上的hitTest:withEvent:方法来实现此目的。
以下是我在项目中所做的一个示例。我将UIView子类化,并将其接收的所有触摸重定向到特定视图。在您的情况下,您将所有触摸重定向到滚动视图。
.h file:
@import UIKit.UIView;
/*!
@class TouchableView
@abstract Touchable view.
*/
@interface TouchableView : UIView
/*!
@property viewToReceiveTouches
@abstract View that receives touches instead of a given view.
*/
@property (nonatomic, weak) IBOutlet UIView *viewToReceiveTouches;
@end
.m file:
@import UIKit.UIButton;
@import UIKit.UITableView;
@import UIKit.UITextField;
#import "TouchableView.h"
@implementation TouchableView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if ( [self shouldViewReceiveTouch:self inPoint:point] )
{
return [super hitTest:point withEvent:event];
}
else if ( CGRectContainsPoint(self.bounds, point) && self.isUserInteractionEnabled )
{
return self.viewToReceiveTouches;
}
return nil;
}
- (BOOL)shouldViewReceiveTouch:(UIView *)view inPoint:(CGPoint)point
{
if ( !CGRectContainsPoint(view.bounds, point) || !view.isUserInteractionEnabled )
{
return NO;
}
if ( [view isKindOfClass:[UIButton class]] ||
[view isKindOfClass:[UITextField class]] ||
[view isKindOfClass:[UITableViewCell class]] ||
[view isKindOfClass:[UITableView class]] )
{
return YES;
}
for ( UIView *subview in view.subviews )
{
if ( [self shouldViewReceiveTouch:subview inPoint:[view convertPoint:point toView:subview]] )
{
return YES;
}
}
return NO;
}
@end
答案 1 :(得分:0)
由于你的身高可能会有所不同,我认为最简单的方法就是将所有内容放在!important
中。
Segue公司?没问题,执行UICollectionView
,更改数据和高度,然后重新加载didSelectRowAtIndexPath
。
您还可以将UICollectionView
添加到简单的UICollectionView
,这样您就可以在其上添加一些静态内容。
这是一个示例应用来证明这一点: https://github.com/tirrorex/Apps/tree/master/Swift/Sampleapp
你必须实现一个动态高度,你可以在其上找到一些线程(基本上你可以为包含你的collectionview / tableview的单元格做一个特殊情况,这样这个单元格将从nib加载,这可能对你有帮助) : UICollectionView Self Sizing Cells with Auto Layout
答案 2 :(得分:0)
您可以为scrollview内容设置动态大小。这就是我做的。
dynamicHeight
以存储新的TableView / CollectionView高度。 查看我的代码(演示here)
@IBAction func selectPage(sender: AnyObject) {
// clear all child controller before load new controller
for controller in childViewControllers {
controller.removeFromParentViewController()
}
for view in pageContainer.subviews {
view.removeFromSuperview()
}
let segment = sender as! UISegmentedControl
if segment.selectedSegmentIndex == 0 {
createImageController()
}
else {
createTextController()
}
updateScrollContentSize()
}
func updateScrollContentSize() {
// 150 is your view and segment height
scrollView.contentSize = CGSize(width: view.frame.size.width, height: dynamicHeight + 150)
}
func createTextController() {
let textController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("TextController") as! TextController
dynamicHeight = textController.getTableContentHeight()
textController.tableView.scrollEnabled = false
self.addChildViewController(textController)
pageContainer.addSubview(textController.view)
textController.view.frame = CGRectMake(0, 0, pageContainer.frame.size.width, dynamicHeight)
}
func createImageController() {
let imageController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ImageShowController") as! ImageShowController
dynamicHeight = imageController.getTableContentHeight()
imageController.tableView.scrollEnabled = false
self.addChildViewController(imageController)
pageContainer.addSubview(imageController.view)
imageController.view.frame = CGRectMake(0, 0, pageContainer.frame.size.width, dynamicHeight * 2)
}
希望这可以提供帮助。