Как сделать вид прокрутки? Так же, как профиль Instagram
UIView, SegmentedController и UIContainerView в ScrollView или что-то подобное?
В моей раскадровке у меня есть VC, содержащий UIView наверху, сегментированный контроллер в середине и 2 ContainerViewControllers внизу с встраиванием segue в новые VC.
В новом VC у меня есть TableView и CollectionView (например, профиль Instagram).
Моя проблема в том, что мне нужно, чтобы SegmentedController и UIView прокручивались с помощью ContainerView (TableView/CollectionView), на данный момент только часть элементов ContainerView прокручивается, а части выше, которые исправлены.
Теперь я предполагаю, что мне, вероятно, нужно поместить все в UIScrollView, поэтому я попробовал это и правильно поместил все дорогие. Но когда дело дошло до его настройки в файле Swift, я только сейчас могу установить высоту прокрутки, но, очевидно, высота, которая мне нужна, может варьироваться и не является фиксированной высотой!
Если кто-нибудь может помочь мне здесь, это было бы фантастически или, может быть, указать мне на аналогичный вопрос, который уже задан здесь? Я уже посмотрел, но ничего не нашел к сожалению!
Вот изображение ниже, объясняющее в основном, что мне нужно, если выше я был не очень ясен.
вот пример, который вы можете увидеть: https://github.com/Jackksun/ScrollIssue
![введите описание изображения здесь]()
Ответы
Ответ 1
Итак, как я понял, вы хотите, чтобы ваш профиль прокрутки получал штрихи за пределами его границ. Вы можете добиться этого путем переопределения метода 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
Ответ 2
Поскольку ваш рост может варьироваться, самым простым способом, по моему мнению, сделать то, что вы хотите, - все это поставить в UICollectionView
.
SEGUE? Нет проблем, выполните didSelectRowAtIndexPath
, измените свои данные и высоту и перезагрузите UICollectionView
.
Вы также можете добавить UICollectionView
к простому UIView
, который позволит вам разместить поверх него статический контент.
Вот пример приложения, демонстрирующий это:
https://github.com/tirrorex/Apps/tree/master/Swift/Sampleapp
Вам нужно будет реализовать динамическую высоту, вы можете найти некоторые потоки на этом (в основном вы можете сделать специальный случай для ячейки, содержащей ваш viewview/tableview, чтобы эта ячейка была загружена из nib, что могло бы вам помочь):
Ячейки для самостоятельной калибровки UICollectionView с автоматической компоновкой
Ответ 3
Вы можете установить динамический размер для содержимого прокрутки. Вот что я сделал.
- Определите
dynamicHeight
, чтобы сохранить новую высоту TableView/CollectionView.
- Каждый раз, когда вы меняете управление сегментом, получаете высоту контроллера и обновляете размер содержимого прокрутки.
Взгляните на мой код (demo здесь)
@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)
}
Надеюсь, это поможет.