关于self.view.window与viewDidLoad、viewWillAppear、viewDidAppear

本文探讨了在iOS应用开发中,如何在不同视图周期阶段使用self.view.window来获取窗口属性,以及其在viewDidLoad、viewWillAppear、viewDidAppear方法中的不同表现。
部署运行你感兴趣的模型镜像

关于self.view.window与viewDidLoad、viewWillAppear、viewDidAppear

 

在进入一个界面(UIViewController),如果要在进入的时候使用self.view.window,那么必须在将使用代码放在viewDidAppear方法中,而viewDidLoad、viewWillAppear中self.view.window.frame为0{{0,0},{0,0}}。

 

- (void)viewDidLoad {
    NSLog(@"viewDidLoad");
    [super viewDidLoad];
}


-(void)viewWillAppear:(BOOL)animated{
    NSLog(@"viewWillAppear");
    [super viewWillAppear:animated];
}

-(void)viewDidAppear:(BOOL)animated{
    NSLog(@"viewDidAppear");
    [super viewDidAppear:animated];
    [self _doTest01];
}

- (void)_doTest01 {
    NSLog(@"_doTest01");
    //UIView
    UIView* vwFullScreenView = [[UIView alloc]init];
    vwFullScreenView.backgroundColor=[UIColor yellowColor];
    vwFullScreenView.frame=self.view.window.frame;
    NSLog(@"%@",NSStringFromCGRect(vwFullScreenView.frame));
    [self.view.window addSubview:vwFullScreenView];
    
    //UILabel
    UILabel* lblTitle = [[UILabel alloc]init];
    lblTitle.text=@"显示了@_@";
    lblTitle.frame=CGRectMake(0, 0, 200, 40);
    lblTitle.textAlignment=NSTextAlignmentCenter;
    lblTitle.backgroundColor=[UIColor whiteColor];
    lblTitle.center=vwFullScreenView.center;
    [vwFullScreenView addSubview:lblTitle];
    
}

输出:

2015-11-01 09:21:27.031 demo010[7638:261914] viewDidLoad
2015-11-01 09:21:27.032 demo010[7638:261914] viewWillAppear
2015-11-01 09:21:27.038 demo010[7638:261914] viewDidAppear
2015-11-01 09:21:27.038 demo010[7638:261914] _doTest01
2015-11-01 09:21:27.039 demo010[7638:261914] {{0, 0}, {320, 568}}



 

 

如果将[self _doTest01];代码放到viewDidLoad 或 viewWillAppear 方法中,那么输出结果如下:

2015-11-01 09:35:00.054 demo010[7762:271018] viewDidLoad
2015-11-01 09:35:00.054 demo010[7762:271018] viewWillAppear
2015-11-01 09:35:00.054 demo010[7762:271018] _doTest01
2015-11-01 09:35:00.054 demo010[7762:271018] {{0, 0}, {0, 0}}
2015-11-01 09:35:00.061 demo010[7762:271018] viewDidAppear

 

可以看到self.view.window的frame为 {{0, 0}, {0, 0}},说明此时self.view.window还没显示出来。

 

 

 

 

 

 

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

// // NewMessageToastController.swift // OmadaSurveillance // // Created by wuhanpeng on 2025/11/5. // import Cocoa class NewMessageToastController: TPBaseViewController { private let color = NSColor(red: CGFloat(169) / 255.0, green: CGFloat(169) / 255.0, blue: CGFloat(169) / 255.0, alpha: 1.0) private var visiable = false private var allButtonSelected = true var cardDidClickedCallBack: (() -> Void)? var isVisiable: Bool { return self.visiable } // 顶部区域 private var topTitleLabel = TPBLabel() private var buttonContainerView = NSView() private var allButton = TPBButton.cardButton(withTitle: "All") private var unReadButton = TPBButton.cardButton(withTitle: "未读消息(\(TPGuardMessageManager.shard.unReadCount))") private var clearAllButton = TPBButton.cardButton(withTitle: "一键已读") // 第一个列表 private var titleLabel = TPBLabel() private var foldButton = TPBButton.iconButton(with: .messageFoldButton) private var closeButton = TPBButton.iconButton(with: .messageCloseButton) private var messageListView = TPGuardMessageListView() private var scrollView = NSScrollView() private var isExpanded = true { didSet { isExpanded.toggle() messageListView.toggleCollapseState() } } // 第二个列表(新增) private var titleLabel2 = TPBLabel() private var foldButton2 = TPBButton.iconButton(with: .messageFoldButton) private var closeButton2 = TPBButton.iconButton(with: .messageCloseButton) private var messageListView2 = TPGuardMessageListView() private var scrollView2 = NSScrollView() private var isExpanded2 = true { didSet { isExpanded2.toggle() messageListView2.toggleCollapseState() } } func changeVisiable() { self.visiable.toggle() } func hideAll() { self.view.isHidden.toggle() } override func viewDidLoad() { super.viewDidLoad() messageListView2.messageDidClickedCallBack = { [weak self] in print(self?.cardDidClickedCallBack) self?.cardDidClickedCallBack?() } } override func viewWillAppear() { super.viewWillAppear() messageListView.deviceShareMessages = TPGuardMessageManager.shard.eventMessages messageListView2.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages NotificationCenter.default.addObserver( self, selector: #selector(messageListDidChange), name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil ) NotificationCenter.default.addObserver( self, selector: #selector(messageListDidChange), name: TPGuardNewDeviceShareMessageDidChangeNotification, object: nil ) NotificationCenter.default.addObserver( self, selector: #selector(unreadCountDidChange), name: UnReadNumDidChangeNotification, object: nil ) } override func viewWillDisappear() { super.viewWillDisappear() NotificationCenter.default.removeObserver( self, name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil ) NotificationCenter.default.removeObserver( self, name: TPGuardNewDeviceShareMessageDidChangeNotification, object: nil ) NotificationCenter.default.removeObserver( self, name: UnReadNumDidChangeNotification, object: nil ) } @objc func messageListDidChange() { messageListView.deviceShareMessages = TPGuardMessageManager.shard.eventMessages messageListView2.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } @objc func unreadCountDidChange() { unReadButton.title = "未读消息(\(TPGuardMessageManager.shard.unReadCount))" } override func viewDidAppear() { super.viewDidAppear() messageListView.reloadMessages() messageListView2.reloadMessages() } override func setupSubviews() { super.setupSubviews() view.wantsLayer = true view.layer?.backgroundColor = NSColor.clear.cgColor // 新增顶部标题和按钮容器 topTitleLabel.font = NSFont.tpm16Medium() topTitleLabel.textColor = color //NSColor.tpTextWhite topTitleLabel.textAlignment = .natural topTitleLabel.stringValue = "消息中心" buttonContainerView.wantsLayer = true buttonContainerView.layer?.backgroundColor = NSColor.clear.cgColor allButton.font = NSFont.tpm18Medium() unReadButton.titleColor = color unReadButton.font = NSFont.tpm18Medium() clearAllButton.font = NSFont.tpm14Medium() allButton.target = self allButton.action = #selector(filterButtonClicked(_:)) unReadButton.target = self unReadButton.action = #selector(filterButtonClicked(_:)) // --- 第一个列表 UI --- titleLabel.font = NSFont.tpm16Medium() titleLabel.textColor = NSColor.tpTextWhite titleLabel.textAlignment = .natural scrollView.backgroundColor = .clear scrollView.drawsBackground = false scrollView.wantsLayer = true scrollView.layer?.backgroundColor = NSColor.clear.cgColor scrollView.contentView.backgroundColor = NSColor.clear scrollView.documentView = messageListView messageListView.autoresizingMask = [] messageListView.wantsLayer = true messageListView.layer?.masksToBounds = true // 维持原有回调逻辑 messageListView.messageListViewStatusDidChangeCallback = { [weak self] height, collapsed in guard let self = self else { return } if collapsed { self.titleLabel.isHidden = true self.foldButton.isHidden = true self.closeButton.isHidden = true self.scrollView.snp.remakeConstraints { make in make.top.equalTo(self.buttonContainerView.snp.bottom).offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(height) } } else { self.titleLabel.isHidden = false self.foldButton.isHidden = false self.closeButton.isHidden = false let newHeight = min( height, (self.view.window?.contentView?.bounds.height ?? 0) - 42 - 70 - 56 ) self.scrollView.snp.remakeConstraints { make in make.top.equalTo(self.buttonContainerView.snp.bottom).offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(newHeight) } } } // --- 第二个列表 UI(上面相同逻辑) --- titleLabel2.font = NSFont.tpm16Medium() titleLabel2.textColor = NSColor.tpTextWhite titleLabel2.textAlignment = .natural scrollView2.backgroundColor = .clear scrollView2.drawsBackground = false scrollView2.wantsLayer = true scrollView2.layer?.backgroundColor = NSColor.clear.cgColor scrollView2.contentView.backgroundColor = NSColor.clear scrollView2.documentView = messageListView2 messageListView2.autoresizingMask = [] messageListView2.wantsLayer = true messageListView2.layer?.masksToBounds = true messageListView2.messageListViewStatusDidChangeCallback = { [weak self] height, collapsed in guard let self = self else { return } if collapsed { self.titleLabel2.isHidden = true self.foldButton2.isHidden = true self.closeButton2.isHidden = true self.scrollView2.snp.remakeConstraints { make in make.top.equalTo(self.scrollView.snp.bottom).offset(20) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(height) } } else { self.titleLabel2.isHidden = false self.foldButton2.isHidden = false self.closeButton2.isHidden = false let newHeight = min( height, (self.view.window?.contentView?.bounds.height ?? 0) - 42 - 70 - 56 ) self.scrollView2.snp.remakeConstraints { make in make.top.equalTo(self.scrollView.snp.bottom).offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(newHeight) } } } view.addSubview(topTitleLabel) view.addSubview(buttonContainerView) buttonContainerView.addSubview(allButton) buttonContainerView.addSubview(unReadButton) buttonContainerView.addSubview(clearAllButton) view.addSubview(titleLabel) view.addSubview(foldButton) view.addSubview(closeButton) view.addSubview(scrollView) view.addSubview(titleLabel2) view.addSubview(foldButton2) view.addSubview(closeButton2) view.addSubview(scrollView2) } @objc func filterButtonClicked(_ sender: NSButton) { allButton.titleColor = (sender == allButton) ? clearAllButton.titleColor : self.color unReadButton.titleColor = (sender == unReadButton) ? clearAllButton.titleColor : self.color if (sender == allButton && allButtonSelected == false){ allButtonSelected = true messageListView.deviceShareMessages = TPGuardMessageManager.shard.eventMessages messageListView2.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } else if (sender == unReadButton && allButtonSelected == true) { allButtonSelected = false messageListView.deviceShareMessages = TPGuardMessageManager.shard.newEventMessages messageListView2.deviceShareMessages = TPGuardMessageManager.shard.newDeviceMessages } } override func setupInitialData() { super.setupInitialData() messageListView.deviceShareMessages = TPGuardMessageManager.shard.eventMessages messageListView2.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } override func makeConstraints() { super.makeConstraints() topTitleLabel.snp.makeConstraints { make in make.top.equalToSuperview().offset(12) make.leading.equalToSuperview().offset(30) } buttonContainerView.snp.makeConstraints { make in make.top.equalTo(topTitleLabel.snp.bottom) make.leading.trailing.equalToSuperview() make.height.equalTo(48) } allButton.snp.makeConstraints{ make in make.top.equalToSuperview().offset(12) make.leading.equalToSuperview() } allButton.snp.makeConstraints{ make in make.top.equalToSuperview().offset(16) make.leading.equalTo(topTitleLabel) make.height.equalTo(24) } unReadButton.snp.makeConstraints{ make in make.centerY.equalTo(allButton) make.leading.equalTo(allButton).offset(32) make.height.equalTo(24) } clearAllButton.snp.makeConstraints{ make in make.centerY.equalTo(allButton) make.trailing.equalToSuperview().offset(-24) make.height.equalTo(24) } updateSubviewStatus() updateSubviewStatus2() } override func bindActions() { super.bindActions() clearAllButton.onClickCallback = {[weak self] in print("全部清除") guard let self = self else { return } TPGuardMessageManager.shard.readAllMessages() for message in self.messageListView.deviceShareMessages.messages { message.state = true } for message in self.messageListView2.deviceShareMessages.messages { message.state = true } self.messageListView.reloadMessages() self.messageListView2.reloadMessages() } foldButton.onClickCallback = { [weak self] in print("fold Button 1") self?.messageListView.toggleCollapseState() } closeButton.onClickCallback = { [weak self] in print("Close Button 1") guard let self = self else { return } let messageManager = TPGuardMessageManager.shard var messageIds:[UInt64] = [] for message in self.messageListView.deviceShareMessages.messages { message.state = true messageIds.append(message.vmsMessageID) } //messageManager.clearCategoryMessages(messages: messageIds, type: TPSSMessageOverType.event) self.messageListView.reloadMessages() } foldButton2.onClickCallback = { [weak self] in print("fold Button 2") self?.messageListView2.toggleCollapseState() } closeButton2.onClickCallback = { [weak self] in print("Close Button 2") guard let self = self else { return } let messageManager = TPGuardMessageManager.shard var messageIds:[UInt64] = [] for message in self.messageListView2.deviceShareMessages.messages { message.state = true messageIds.append(message.vmsMessageID) } //messageManager.clearCategoryMessages(messages: messageIds, type: TPSSMessageOverType.status) self.messageListView2.reloadMessages() // self?.scrollView2.isHidden = true // self?.titleLabel2.isHidden = true // self?.foldButton2.isHidden = true // self?.closeButton2.isHidden = true } } override func setupText() { super.setupText() // titleLabel.text = LocalizedString(key: omadaSharePush) // titleLabel2.text = LocalizedString(key: omadaSharePush) titleLabel.text = ("events") titleLabel2.text = ("status") } private func updateSubviewStatus() { if isExpanded { titleLabel.isHidden = false foldButton.isHidden = false closeButton.isHidden = false titleLabel.snp.remakeConstraints { make in make.top.equalTo(buttonContainerView.snp.bottom).offset(12) make.leading.equalToSuperview().offset(24) } foldButton.snp.remakeConstraints { make in make.top.equalTo(buttonContainerView.snp.bottom).offset(11) make.size.equalTo(24) } closeButton.snp.remakeConstraints { make in make.centerY.equalTo(foldButton) make.leading.equalTo(foldButton.snp.trailing).offset(16) make.size.equalTo(24) make.trailing.equalToSuperview().offset(-24) } scrollView.snp.remakeConstraints { make in make.top.equalTo(foldButton.snp.bottom).offset(16) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(240) } } else { titleLabel.isHidden = true foldButton.isHidden = true closeButton.isHidden = true scrollView.snp.makeConstraints{ make in make.top.equalTo(buttonContainerView.snp.bottom).offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(10) } } } private func updateSubviewStatus2() { if isExpanded2 { titleLabel2.isHidden = false foldButton2.isHidden = false closeButton2.isHidden = false titleLabel2.snp.remakeConstraints { make in make.top.equalTo(scrollView.snp.bottom).offset(12) make.leading.equalToSuperview().offset(24) } foldButton2.snp.remakeConstraints { make in make.top.equalTo(scrollView.snp.bottom).offset(11) make.size.equalTo(24) } closeButton2.snp.remakeConstraints { make in make.centerY.equalTo(foldButton2) make.leading.equalTo(foldButton2.snp.trailing).offset(16) make.trailing.equalToSuperview().offset(-24) make.size.equalTo(24) } scrollView2.snp.remakeConstraints { make in make.top.equalTo(scrollView.snp.bottom).offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) } } else { titleLabel.isHidden = true foldButton.isHidden = true closeButton.isHidden = true scrollView.snp.makeConstraints{ make in make.top.equalTo(scrollView).offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(10) } } } } 关注我的这个类,你可以看到有两个几乎一样的内容,能否将这块同样结构的内容封装为一个单独的视图提高复用性?
最新发布
11-06
// // TPGuardDeviceShareMessageController.swift // OmadaSurveillance // // Created by 18908757-BG on 2025/6/3. // import Cocoa class TPGuardDeviceShareMessageController: TPBaseViewController { private var titleLabel = TPBLabel() private var foldButton = TPBButton.iconButton(with: .messageFoldButton) private var closeButton = TPBButton.iconButton(with: .messageCloseButton) private var messageListView = TPGuardMessageListView() private var scrollView = NSScrollView() private var isExpanded = true { didSet { isExpanded.toggle() messageListView.toggleCollapseState() } } override func viewDidLoad() { super.viewDidLoad() // Do view setup here. } override func viewWillAppear() { super.viewWillAppear() messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages NotificationCenter.default.addObserver(self, selector: #selector(messageListDidChange), name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil) } override func viewWillDisappear() { super.viewWillDisappear() NotificationCenter.default.removeObserver(self, name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil) } @objc func messageListDidChange() { messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } override func viewDidAppear() { super.viewDidAppear() messageListView.reloadMessages() } override func setupSubviews() { super.setupSubviews() view.wantsLayer = true view.layer?.backgroundColor = NSColor.clear.cgColor titleLabel.font = NSFont.tpm16Medium() titleLabel.textColor = NSColor.tpTextWhite titleLabel.textAlignment = .natural scrollView.backgroundColor = NSColor.clear scrollView.drawsBackground = false scrollView.wantsLayer = true scrollView.layer?.backgroundColor = NSColor.clear.cgColor scrollView.contentView.backgroundColor = NSColor.clear scrollView.documentView = messageListView messageListView.autoresizingMask = [] messageListView.wantsLayer = true messageListView.layer?.masksToBounds = true messageListView.messageListViewStatusDidChangeCallback = { [weak self] height, collapsed in if collapsed { self?.titleLabel.isHidden = true self?.foldButton.isHidden = true self?.closeButton.isHidden = true self?.scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(height) } } else { self?.titleLabel.isHidden = false self?.foldButton.isHidden = false self?.closeButton.isHidden = false let newHeight = min(height, (self?.view.window?.contentView?.bounds.height ?? 0) - 42 - 70 - 56) self?.scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(newHeight) } } } view.addSubview(titleLabel) view.addSubview(foldButton) view.addSubview(closeButton) view.addSubview(scrollView) } override func setupInitialData() { super.setupInitialData() messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } override func makeConstraints() { super.makeConstraints() updateSubviewStatus() } override func bindActions() { super.bindActions() foldButton.onClickCallback = { [weak self] in print("fold Button") self?.messageListView.toggleCollapseState() } closeButton.onClickCallback = { if self.view.superview != nil { self.view.removeFromSuperview() } print("Close Button") } } override func setupText() { super.setupText() titleLabel.text = LocalizedString(key: omadaSharePush) } private func updateSubviewStatus() { if isExpanded { titleLabel.isHidden = false foldButton.isHidden = false closeButton.isHidden = false titleLabel.snp.remakeConstraints { make in make.top.equalToSuperview().offset(12) make.leading.equalToSuperview().offset(24) } foldButton.snp.remakeConstraints { make in make.top.equalToSuperview().offset(11) make.size.equalTo(24) } closeButton.snp.remakeConstraints { make in make.centerY.equalTo(foldButton) make.leading.equalTo(foldButton.snp.trailing).offset(16) make.size.equalTo(24) make.trailing.equalToSuperview().offset(-24) } scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(-24) make.width.equalTo(420) } } else { titleLabel.isHidden = true foldButton.isHidden = true closeButton.isHidden = true scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(10) } } } } 这个controller现在有一个列表,可以折叠展开,扩展一下,实现两个同样的列表,都包含相同的折叠关闭按钮,使用同一个数据源即可
10-10
// // MessageCenterController.swift // OmadaSurveillance // // Created by wuhanpeng on 2025/10/9. // import Cocoa class MessageCenterController: TPBaseViewController { private var eventListView = ScrollMessageListView() private var deviceListView = ScrollMessageListView() override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear() { super.viewWillAppear() eventListView.messageListView.deviceShareMessages = TPGuardMessageManager.shard.eventMessage deviceListView.messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages NotificationCenter.default.addObserver(self, selector: #selector(messageListDidChange), name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil) } override func viewWillDisappear() { super.viewWillDisappear() NotificationCenter.default.removeObserver(self, name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil) } @objc func messageListDidChange() { eventListView.messageListView.deviceShareMessages = TPGuardMessageManager.shard.eventMessage deviceListView.messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } override func viewDidAppear() { super.viewDidAppear() eventListView.reloadMessages() deviceListView.reloadMessages() } override func setupSubviews() { super.setupSubviews() view.wantsLayer = true view.layer?.backgroundColor = NSColor.clear.cgColor view.addSubview(eventListView) view.addSubview(deviceListView) } override func setupInitialData() { super.setupInitialData() eventListView.messageListView.deviceShareMessages = TPGuardMessageManager.shard.eventMessage deviceListView.messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } override func makeConstraints() { super.makeConstraints() } override func bindActions() { super.bindActions() eventListView.onFoldButtonClick = { print("fold Button") } eventListView.onCloseButtonClick = { if self.view.superview != nil { self.view.removeFromSuperview() } print("Close Button") } deviceListView.onFoldButtonClick = { print("fold Button device") } deviceListView.onCloseButtonClick = { if self.view.superview != nil { self.view.removeFromSuperview() } print("Close Button device") } } override func setupText() { super.setupText() eventListView.setTitle(LocalizedString(key: omadaSharePush)) deviceListView.setTitle(LocalizedString(key: omadaSharePush)) } } // // ScrollMessageListView.swift // OmadaSurveillance // // Created by wuhanpeng on 2025/10/9. // import Cocoa class ScrollMessageListView: NSView { private var titleLabel = TPBLabel() private var foldButton = TPBButton.iconButton(with: .messageFoldButton) private var closeButton = TPBButton.iconButton(with: .messageCloseButton) var messageListView = TPGuardMessageListView() private var scrollView = NSScrollView() private var isExpanded = true { didSet { updateSubviewStatus() messageListView.toggleCollapseState() } } // 回调闭包 var onCloseButtonClick: (() -> Void)? var onFoldButtonClick: (() -> Void)? var onStatusChange: ((CGFloat, Bool) -> Void)? // // 消息数据源 // var deviceShareMessages: [TPGuardDeviceShareMessage]? { // didSet { // messageListView.deviceShareMessages = deviceShareMessages // } // } override init(frame frameRect: NSRect) { super.init(frame: frameRect) setupView() setupConstraints() setupActions() setupNotifications() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } deinit { NotificationCenter.default.removeObserver(self) } private func setupView() { wantsLayer = true layer?.backgroundColor = NSColor.clear.cgColor titleLabel.font = NSFont.tpm16Medium() titleLabel.textColor = NSColor.tpTextWhite titleLabel.textAlignment = .natural scrollView.backgroundColor = NSColor.clear scrollView.drawsBackground = false scrollView.wantsLayer = true scrollView.layer?.backgroundColor = NSColor.clear.cgColor scrollView.contentView.backgroundColor = NSColor.clear scrollView.documentView = messageListView messageListView.autoresizingMask = [] messageListView.wantsLayer = true messageListView.layer?.masksToBounds = true messageListView.messageListViewStatusDidChangeCallback = { [weak self] height, collapsed in self?.handleStatusChange(height: height, collapsed: collapsed) } addSubview(titleLabel) addSubview(foldButton) addSubview(closeButton) addSubview(scrollView) } private func setupConstraints() { updateSubviewStatus() } private func setupActions() { foldButton.onClickCallback = { [weak self] in self?.onFoldButtonClick?() self?.messageListView.toggleCollapseState() } closeButton.onClickCallback = { [weak self] in self?.onCloseButtonClick?() } } private func setupNotifications() { NotificationCenter.default.addObserver( self, selector: #selector(messageListDidChange), name: TPGuardNewDeviceShareMessageDidReceiveNotification, object: nil ) } @objc private func messageListDidChange() { messageListView.deviceShareMessages = TPGuardMessageManager.shard.deviceShareMessages } private func handleStatusChange(height: CGFloat, collapsed: Bool) { if collapsed { titleLabel.isHidden = true foldButton.isHidden = true closeButton.isHidden = true scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(height) } } else { titleLabel.isHidden = false foldButton.isHidden = false closeButton.isHidden = false let newHeight = min(height, (window?.contentView?.bounds.height ?? 0) - 42 - 70 - 56) scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(newHeight) } } onStatusChange?(height, collapsed) layoutSubtreeIfNeeded() } private func updateSubviewStatus() { if isExpanded { titleLabel.isHidden = false foldButton.isHidden = false closeButton.isHidden = false titleLabel.snp.remakeConstraints { make in make.top.equalToSuperview().offset(12) make.leading.equalToSuperview().offset(24) } foldButton.snp.remakeConstraints { make in make.top.equalToSuperview().offset(11) make.size.equalTo(24) } closeButton.snp.remakeConstraints { make in make.centerY.equalTo(foldButton) make.leading.equalTo(foldButton.snp.trailing).offset(16) make.size.equalTo(24) make.trailing.equalToSuperview().offset(-24) } scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(42) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(-24) make.width.equalTo(420) } } else { titleLabel.isHidden = true foldButton.isHidden = true closeButton.isHidden = true scrollView.snp.remakeConstraints { make in make.top.equalToSuperview().offset(10) make.leading.equalToSuperview().offset(24) make.trailing.equalToSuperview().offset(-24) make.bottom.equalToSuperview().offset(-24) make.width.equalTo(420) make.height.equalTo(10) } } } func setTitle(_ title: String) { titleLabel.text = title } func reloadMessages() { messageListView.reloadMessages() } func toggleExpandState() { isExpanded.toggle() } } 这是我封装后的view和controller,现在我要在controller中呈现两个这样的view,约束之类的怎么设定?帮我完善
10-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值