採用 雙層 UIScrollView 嵌套 架構:
// 外層:分頁滾動容器
_huaKuang.contentSize = CGSizeMake(kuan * 4, gao); // 4 頁寬度
_huaKuang.pagingEnabled = YES; // 啟用分頁
_huaKuang.showsHorizontalScrollIndicator = NO; // 隱藏指示器
_huaKuang.showsVerticalScrollIndicator = NO;
_huaKuang.delegate = self; // 監聽滾動結束
// 內層:單圖縮放容器
uisv.minimumZoomScale = 0.5; // 最小縮放 0.5x
uisv.maximumZoomScale = 1.5; // 最大縮放 1.5x
uisv.delegate = self; // 實現 viewForZoomingInScrollView
uisv.showsHorizontalScrollIndicator = NO;
uisv.showsVerticalScrollIndicator = NO;
- (void)tianJianZiShiTu {
for (int i = 0; i < 3; i++) {
// 1. 建立內層 ScrollView (留 20pt 間距)
UIScrollView *uisv = [[UIScrollView alloc]
initWithFrame:CGRectMake((kuan + 20) * i, 0, kuan, gao)];
[_huaKuang addSubview:uisv];
// 2. 建立 UIImageView 載入圖片
UIImageView *uiiv = [[UIImageView alloc]
initWithFrame:CGRectMake(0, 0, kuan, gao)];
NSString *imageName = [NSString stringWithFormat:@\"new_feature_%d\", i + 1];
uiiv.image = [UIImage imageNamed:imageName];
uiiv.tag = 1000; // 標記以便查找
[uisv addSubview:uiiv];
// 3. 添加雙擊手勢
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(dianJiShiJian:)];
tap.numberOfTapsRequired = 2; // 雙擊
[uisv addGestureRecognizer:tap];
}
}
- (void)dianJiShiJian:(UITapGestureRecognizer *)tap {
UIScrollView *uisv1 = (UIScrollView *)tap.view;
// 已縮放 → 恢復 1.0
if (uisv1.zoomScale != 1.0) {
[uisv1 setZoomScale:1.0 animated:YES];
return;
}
// 未縮放 → 以點擊點為中心放大
CGPoint location = [tap locationInView:tap.view];
CGRect rect = CGRectMake(location.x - 100, location.y - 100, 200, 200);
[uisv1 zoomToRect:rect animated:YES];
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
// 外層不縮放
if (scrollView == _huaKuang) return nil;
// 內層:返回 tag=1000 的 UIImageView
return [scrollView viewWithTag:1000];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (scrollView == _huaKuang) {
for (id obj in _huaKuang.subviews) {
if ([obj isKindOfClass:[UIScrollView class]]) {
UIScrollView *scaleSC = (UIScrollView *)obj;
scaleSC.zoomScale = 1.0; // 重置為原始大小
}
}
}
}
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *huaKuang;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 尺寸宏定義
#define kuan [UIScreen mainScreen].bounds.size.width
#define gao [UIScreen mainScreen].bounds.size.height
// 外層配置...
[self tianJianZiShiTu];
}
// 上述所有方法...
@end
| 功能 | 實現關鍵 | 注意事項 |
|---|---|---|
| 水平分頁 | pagingEnabled + contentSize 為整數倍寬度 | 需精確計算 frame,避免對齊偏差 |
| 圖片縮放 | 內層 ScrollView + viewForZoomingInScrollView 返回 UIImageView | minimum/maximumZoomScale 限定範圍 |
| 雙擊智能縮放 | UITapGestureRecognizer (numberOfTapsRequired=2) + zoomToRect: | 以點擊點為中心,計算目標 rect |
| 頁面切換重置 | scrollViewDidEndDecelerating 遍歷子視圖重置 zoomScale | 僅處理外層滾動結束事件 |
| 間距處理 | frame 計算加入 20pt 間距 (kuan + 20) * i | 視覺分離,避免緊湊感 |