You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS-Swift:如何为头像添加弹窗放大查看的功能选项

实现iOS头像放大查看功能

1. 调整ActionSheet的「View Picture」按钮

原来的action(for:)方法是为相机/相册选择场景设计的,「查看头像」不需要复用这个方法,直接创建独立的UIAlertAction即可:

public func present(from sourceView: UIView, didSelect image: UIImage?) {
    let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
    
    if self.isMediaTypeVideo {
        // 原有视频相关逻辑保留
        if let action = self.action(for: .camera, title: "Take Video") {
            alertController.addAction(action)
        }
        if let action = self.action(for: .photoLibrary, title: "Choose video") {
            alertController.addAction(action)
        }
    }
    else {
        // 原有拍照/选图逻辑保留
        if let action = self.action(for: .camera, title: "Take a Picture") {
            alertController.addAction(action)
        }
        if let action = self.action(for: .photoLibrary, title: "Choose a Picture") {
            alertController.addAction(action)
        }
        
        // 添加查看头像按钮(先判断当前是否有头像,避免无效操作)
        if let currentAvatar = self.userAvatarImageView.image { // 替换为你项目中显示头像的UIImageView实例
            let viewAction = UIAlertAction(title: "View Picture", style: .default) { [weak self] _ in
                self?.showAvatarPreview(with: currentAvatar)
            }
            alertController.addAction(viewAction)
        }
    }
    
    // 补充取消按钮(原有代码未展示,避免遗漏)
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel)
    alertController.addAction(cancelAction)
    
    // 弹出ActionSheet的原有逻辑保留
    alertController.popoverPresentationController?.sourceView = sourceView
    alertController.popoverPresentationController?.sourceRect = sourceView.bounds
    UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true)
}

2. 实现头像放大预览方法

创建全屏临时视图展示放大后的头像,支持点击关闭:

private func showAvatarPreview(with avatar: UIImage) {
    // 创建全屏背景遮罩
    let previewBackground = UIView(frame: UIScreen.main.bounds)
    previewBackground.backgroundColor = UIColor.black.withAlphaComponent(0.8)
    previewBackground.tag = 999 // 标记用于后续移除
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(dismissAvatarPreview))
    previewBackground.addGestureRecognizer(tapGesture)
    
    // 创建头像展示视图
    let avatarImageView = UIImageView(image: avatar)
    avatarImageView.contentMode = .scaleAspectFit
    avatarImageView.frame = previewBackground.bounds
    avatarImageView.isUserInteractionEnabled = true
    
    // 添加到窗口显示
    previewBackground.addSubview(avatarImageView)
    UIApplication.shared.keyWindow?.addSubview(previewBackground)
    
    // 添加淡入动画
    previewBackground.alpha = 0
    UIView.animate(withDuration: 0.3) {
        previewBackground.alpha = 1
    }
}

@objc private func dismissAvatarPreview() {
    guard let previewBackground = UIApplication.shared.keyWindow?.viewWithTag(999) else { return }
    // 淡出后移除视图
    UIView.animate(withDuration: 0.3, animations: {
        previewBackground.alpha = 0
    }) { _ in
        previewBackground.removeFromSuperview()
    }
}

3. 可选优化:支持双指缩放

如果需要给预览头像添加缩放功能,可添加缩放手势:

// 在showAvatarPreview方法中给avatarImageView添加缩放手势
let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
avatarImageView.addGestureRecognizer(pinchGesture)

// 实现缩放逻辑
@objc private func handlePinch(_ gesture: UIPinchGestureRecognizer) {
    guard let view = gesture.view else { return }
    view.transform = view.transform.scaledBy(x: gesture.scale, y: gesture.scale)
    gesture.scale = 1
}

内容的提问来源于stack exchange,提问作者Mycode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 02:27:46