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

iOS 長按手勢:正確移除動態新增的 UIImageView

     編輯:程式設計綜合問答

問題現象

長按開始時 addSubview 一個新 UIImageView,結束時呼叫 [img removeFromSuperview] 但圖片不消失,NSLog 正常輸出。

原因分析

hold: 每次觸發都 **new 一個** UIImageView *img。
Began 階段加入的是 **第一個實例**,
Ended 階段嘗試移除的是 **第二個新建實例**(從未加入視圖層級),故無效果。

正確模式:用 Tag 取回同一實例

#define kTagPhotoImageView 999

- (void)hold:(UILongPressGestureRecognizer *)sender {
    if (sender.state == UIGestureRecognizerStateBegan) {
        NSLog(@"state began");
        UIImageView *img = [[UIImageView alloc] initWithImage:self.photo];
        img.userInteractionEnabled = NO;
        img.tag = kTagPhotoImageView;
        [self.view addSubview:img];
    } else if (sender.state == UIGestureRecognizerStateEnded) {
        NSLog(@"state ended");
        UIImageView *img = (UIImageView *)[self.view viewWithTag:kTagPhotoImageView];
        [img removeFromSuperview];
    }
}

替代方案

  • 屬性強參考:在類別中宣告 @property (nonatomic, strong) UIImageView *fullScreenImageView;,直接操作同一實例。
  • 陣列管理:若允許多張圖疊加,用 NSMutableArray 存放所有動態建立的 imageView,結束時遍歷移除。

關鍵原則

  1. **同一手勢生命週期內操作同一 View 實例**。
  2. 用 tag、屬性或容器保持引用,勿在 Ended 重新 alloc。
  3. 長按手勢會連續觸發 Began → Changed... → Ended,狀態機邏輯要清晰。

掌握「同一實例進、同一實例出」,動態視圖增刪不再失效。

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