我有一個UIScrollView,配置了10頁以上的頁面,其中3頁的內容一次總是出現在屏幕上(下面的屏幕截圖)。如何暫時隱藏UIScrollView中的不活動頁面
對於一個功能,我需要暫時禁用屏幕上的非活動頁,我想知道如果有一種方法可以隱藏所有非活動頁面,並且只保留活動頁面可見。
或者,如果這不可行,是否有可能提取活動頁面中的所有視圖?
謝謝!
我有一個UIScrollView,配置了10頁以上的頁面,其中3頁的內容一次總是出現在屏幕上(下面的屏幕截圖)。如何暫時隱藏UIScrollView中的不活動頁面
對於一個功能,我需要暫時禁用屏幕上的非活動頁,我想知道如果有一種方法可以隱藏所有非活動頁面,並且只保留活動頁面可見。
或者,如果這不可行,是否有可能提取活動頁面中的所有視圖?
謝謝!
嘗試下面的功能,並將其調整爲適合您的情況:
func disableInactiveView(){
let offset = scrollView.contentOffset;
let frame = scrollView.frame;
let shownFrame = CGRect(x: offset.x, y: offset.y , width: frame.size.width, height: frame.size.height)
for colorView in scrollView.subviews{
if shownFrame.contains(colorView.frame) {
colorView.backgroundColor = UIColor.green;
}else{
colorView.backgroundColor = UIColor.red;
}
}
}
添加所有的意見,滾動視圖是不好的表現。管理此類視圖的最佳解決方案是使用UICollectionView
和自定義UICollectionViewCell
s。集合視圖將完成您所需的一切 - 重新使用您的視圖並根據可見矩形正確放置它們。如果你不能使用UICollectionView
嘗試類似的東西:
@interface SampleClass : UIViewController <UIScrollViewDelegate>
@property (nonatomic) UIScrollView *scrollView;
@property (nonatomic) NSUInteger viewsCount;
@property (nonatomic) NSDictionary<NSNumber *, UIView *> *visibleViewsByIndexes;
@end
@implementation SampleClass
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
[self updateViews];
[self hideInactiveViews];
}
- (void)updateViews
{
CGPoint offset = self.scrollView.contentOffset;
CGRect frame = self.scrollView.bounds;
CGRect visibleRect = frame;
visibleRect.origin.x += offset.x;
// Determine indexes of views which should be displayed.
NSMutableArray<NSNumber *> *viewsToDisplay = [NSMutableArray new];;
for (NSUInteger index = 0; index < self.viewsCount; index++) {
CGRect viewFrame = [self frameForViewAtIndex:index];
if (CGRectIntersectsRect(viewFrame, visibleRect)) {
[viewsToDisplay addObject:@(index)];
}
}
// Remove not visible views.
NSDictionary<NSNumber *, UIView *> *oldVisibleViewsByIndexes = self.visibleViewsByIndexes;
NSMutableDictionary<NSNumber *, UIView *> *newVisibleViewsByIndexes = [NSMutableDictionary new];
for (NSNumber *indexNumber in oldVisibleViewsByIndexes.allKeys) {
if (![viewsToDisplay containsObject:indexNumber]) {
UIView *viewToRemove = oldVisibleViewsByIndexes[indexNumber];
[viewToRemove removeFromSuperview];
} else {
newVisibleViewsByIndexes[indexNumber] = oldVisibleViewsByIndexes[indexNumber];
}
}
// Add new views.
for (NSNumber *indexNumber in viewsToDisplay) {
if (![oldVisibleViewsByIndexes.allKeys containsObject:indexNumber]) {
UIView *viewToAdd = [self viewAtIndex:indexNumber.unsignedIntegerValue];
viewToAdd.frame = [self frameForViewAtIndex:indexNumber.unsignedIntegerValue];
[self.scrollView addSubview:viewToAdd];
}
}
self.visibleViewsByIndexes = newVisibleViewsByIndexes;
}
- (CGRect)frameForViewAtIndex:(NSUInteger)index
{
// Return correct frame for view at index.
return CGRectZero;
}
- (UIView *)viewAtIndex:(NSUInteger)index
{
return [UIView new];
}
- (void)hideInactiveViews
{
CGPoint offset = self.scrollView.contentOffset;
CGRect frame = self.scrollView.bounds;
CGRect visibleRect = frame;
visibleRect.origin.x += offset.x;
for (UIView *view in self.visibleViewsByIndexes.allValues) {
if (CGRectContainsRect(visibleRect, view.frame)) {
// Active view.
view.alpha = 1;
} else {
// Inactive view.
view.alpha = 0.2;
}
}
}
@end
你有沒有想過使用UICollectionView的,限於水平軸,使頁面到自定義UICollectionViewCells?它會爲你做所有的繁重工作。 – Stephen
大點斯蒂芬。不幸的是,很多已有的功能都是通過UIScrollView模板製作的,無法調整到collectionView。 – daspianist
你什麼時候想讓它們消失?當滾動開始時滾動結束然後再出現?因爲不活動頁面在滾動時會變爲活動狀態(所以它應該以某種方式顯示),那麼您希望它看起來如何? – timaktimak