首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 自定義 UIScrollView + UIPageControl 無法拖拽?漏寫 self.frame = frame

     編輯:程式設計綜合問答

自定義 `MyView : UIView` 內嵌 `UIScrollView` 與 `UIPageControl`,若 `initWithImageList:andFrame:` 中未給 `self.frame = frame`,導致 View 本身 frame 為 `CGRectZero`,觸摸事件無法傳遞給內部 ScrollView,表現為「無法拖拽」。

錯誤與修正對比

- (instancetype)initWithImageList:(NSArray *)imgArr andFrame:(CGRect)frame {
    self = [super init];
    if (self) {
        // ❌ 缺少這行,self.frame 仍為 (0,0,0,0)
        // self.frame = frame;  

        [self createScrollView:imgArr andFrame:frame];
        [self createPageControl:imgArr andFrame:...];
    }
    return self;
}

修正代碼

- (instancetype)initWithImageList:(NSArray *)imgArr andFrame:(CGRect)frame {
    self = [super init];
    if (self) {
        self.frame = frame;  // ✅ 必須先設定自身 frame
        self.userInteractionEnabled = YES; // 確保接收觸摸
        
        [self createScrollView:imgArr andFrame:frame];
        [self createPageControl:imgArr andFrame:...];
    }
    return self;
}

- (void)createScrollView:(NSArray *)imgArr andFrame:(CGRect)frame {
    self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
    self.scrollView.contentSize = CGSizeMake(frame.size.width * (imgArr.count + 2), frame.size.height);
    self.scrollView.pagingEnabled = YES;
    self.scrollView.showsHorizontalScrollIndicator = NO;
    self.scrollView.delegate = self; // 如需頁碼同步
    // ... 添加 UIImageView 子視圖
    [self addSubview:self.scrollView];
}

驗證清單

  1. ✅ `self.frame = frame` 在 `addSubview` 前執行。
  2. ✅ `self.userInteractionEnabled = YES` (UIView 預設 YES,但明確設定無害)。
  3. ✅ `scrollView.userInteractionEnabled = YES` (預設 YES)。
  4. ✅ `scrollView.pagingEnabled = YES` 啟用分頁。
  5. ✅ 父視圖 `addSubview:self` 時,父視圖 frame 正確且可見。

補上 `self.frame = frame` 後,觸摸事件正常命中 ScrollView,拖拽與分頁即刻恢復正常。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved