uidesigner里面如何让iphone变型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uidesigner里面如何让iphone变型相关的知识,希望对你有一定的参考价值。

我做的内容很长,怎么办呢?

参考技术A 一、直接的方法(The Direct Approach) 即把filename.ui经过uic转换后的C++代码文件ui_filename.h直接包含,使用其里面Ui命名空间下的类(名称和主窗体的objectname相同,这里假设为GoToCellDialog)。[cpp] view plain copy#include "ui_gotocelldialog.h" // uic工具将gotocelldialog.ui生成的C++代码 int main(int argc, char *argv[]) QApplication app(argc, argv); QDialog *dialog= new QDialog; // 用于显示界面的父窗体QDialog(QWidget的子类) Ui::GotoCellDialog ui; // 界面类,必须显示在一个QWidget(或其子类)上 ui.setupUi(dialog); // 将QDialog设置为 GotoCellDialog 的父窗体,这样GotoCellDialog 里面定义的控件就会显示在QDialog窗体内 dialog->show(); return app.exec(); 二、单继承方式(The Single Inheritance Approach) 单继承方式是相对于后面要讲的多继承方式,单继承方式也称组合(即委托或代理)方式。单继承方式简单来说就是在代码中首先要自定义一个子类(例如下文中的GoToCellDialog类),该类要从form对应的窗体类(或其兼容的子类)派生;并用ui生成的类定义一个类里的成员变量,该成员变量可以是值也可以是指针,根据使用成员变量的形式不同,又分为成员变量和指针成员变量两种形式。这样在GoToCellDialog的构造函数中可以直接调用ui和ui中的变量和函数,使用起来很方便。1、使用成员变量 即将 Ui::GotoCellDialog ui; 作为类GotoCellDialog(只继承自QDialog,单一继承)的成员变量。这里有一点值得注意的地方,就是ui文件提供的类被包含在了名为Ui的name space里,这样做的目的是将ui文件的命名空间与用户的代码分离,避免两者出现命名冲突的情况。头文件: gotocelldialog.h[cpp] view plain copy#include <QDialog> #include "ui_gotocelldialog.h" // 因为是成员变量形式,必须包含相应的头文件 class GoToCellDialog: public QDialog Q_OBJECT public: explicit GoToCellDialog(QDialog *parent = 0); private slots: void on_lineEdit_textChanged(); private: Ui::GoToCellDialog ui; ; 实现文件: gotocelldialog.cpp[cpp] view plain copy#include "gotocelldialog.h" #include <QtGui> GoToCellDialog::GoToCellDialog(QWidget *parent) : QDialog(parent) ui.setupUi(this); QRegExp regExp("[A-Za-z][1-9][0-9]0,2"); lineEdit->setValidator(new QRegExpValidator(regExp, this)); connect(okButton, SIGNAL(clicked()), SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), SLOT(reject())); void GoToCellDialog::on_lineEdit_textChanged() // bool hasAcceptableInput () const // This property holds whether the input satisfies the inputMask and the validator. // By default, this property is true. okButton->setEnabled(lineEdit->hasAcceptableInput()); 2、使用指针成员变量 与成员变量形式相似,唯一不同的是,将Ui::GoToCellDialog声明为指针成员,即 Ui::GoToCellDialog *ui;因此,相应的头文件中只要前置声明即可:[cpp] view plain copynamespace Ui class GoToCellDialog; // 前置声明即可,只在实现文件中包含相应的头文件 class GoToCellDialog: public QDialog // 同上 private: Ui::GoToCellDialog *ui; ; 实现文件:[cpp] view plain copy#include "ui_gotocelldialog.h" GoToCellDialog::GoToCellDialog(QDialog *parent) : QDialog(parent), ui(new Ui::GoToCellDialog) ui->setupUi(this); CalculatorForm::~CalculatorForm() delete ui; // 切记删除,释放资源 三、多继承方式(The Multiple Inheritance Approach) 多继承方式就是自定义的类从窗体类和Ui类多重派生。看代码就清楚了:头文件:[cpp] view plain copy#ifndef GOTOCELLDIALOG_H #define GOTOCELLDIALOG_H #include <QDialog> #include "ui_gotocelldialog.h" class GoToCellDialog : public QDialog, public Ui::GoToCellDialog Q_OBJECT public: explicit GoToCellDialog(QWidget *parent = 0); private slots: void on_lineEdit_textChanged(); ; #endif // GOTOCELLDIALOG_H 实现文件:[cpp] view plain copy#include "gotocelldialog.h" #include <QtGui> GoToCellDialog::GoToCellDialog(QWidget *parent) : QDialog(parent) this->setupUi(this); //第1个this指Ui::GoToCellDialog,第2个this指(QDialog) 即 Ui::GoToCellDialog->setupUi(QDialog) QRegExp regExp("[A-Za-z][1-9][0-9]0,2"); lineEdit->setValidator(new QRegExpValidator(regExp, this)); connect(okButton, SIGNAL(clicked()), SLOT(accept())); connect(cancelButton, SIGNAL(clicked()), SLOT(reject())); void GoToCellDialog::on_lineEdit_textChanged() // bool hasAcceptableInput () const // This property holds whether the input satisfies the inputMask and the validator. // By default, this property is true. okButton->setEnabled(lineEdit->hasAcceptableInput());

如何使用 Swift 让 iPhone 振动?

【中文标题】如何使用 Swift 让 iPhone 振动?【英文标题】:How to make iPhone vibrate using Swift? 【发布时间】:2014-10-19 22:00:42 【问题描述】:

我需要让 iPhone 振动,但我不知道如何在 Swift 中做到这一点。我知道在 Objective-C 中,你只需写:

import AudioToolbox
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

但这对我不起作用。

【问题讨论】:

Swift 为您提供相同的功能:developer.apple.com/library/ios/documentation/AudioToolbox/… 在这里您可以找到每个 .caf 和相关类别的所有代码:github.com/TUNER88/iOSSystemSoundsLibrary 例如,如果您想要更轻的振动,您可以使用代码 1003。 【参考方案1】:

简短示例:

import UIKit
import AudioToolbox

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))            
    

加载到您的手机上,它会振动。您可以根据需要将其放入函数或 IBAction 中。

代码更新:

 AudioServicesPlayAlertSoundWithCompletion(SystemSoundID(kSystemSoundID_Vibrate))  

正如苹果代码文档所写:

此功能将在未来版本中弃用。采用 改为 AudioServicesPlaySystemSoundWithCompletion。

注意:如果振动不起作用。检查声音和触觉设置中是否启用了振动

【讨论】:

有没有办法让手机一直振动直到按下按钮? 尼古拉斯问了什么,我也想知道是否有办法让它以某种特殊的方式振动。 我知道有一个 github 可以显示所有 iPhone 音频文件和 3 个振动文件的系统 ID,但有人知道我如何访问其他振动文件吗?例如,我想使用 Staccato 振动,但我不知道 ID,或者即使有 ID。 @Nicholas 如果我发现一个应用程序要求我按下按钮,否则它将永远振动,我将立即从我的设备中删除它。 请记住,如果您的应用的音频会话配置了 AVAudioSessionCategoryPlayAndRecord 或 AVAudioSessionCategoryRecord 音频会话类别,则设备不会振动。这样可以确保振动不会干扰录音。【参考方案2】:

在 iPhone 7 或 7 Plus 上的 iOS 10 中,尝试:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()

【讨论】:

我们都使用 iOS 10,不是吗?它是系统的最新、最好和免费的版本。每个人都应该更新,没有妥协。 在 iOS 10 之后,这只是一个适用于 iPhone 7 或更高版本的功能。在 iPhone 7 之前的设备上将被忽略。 @C6Silver 你说得对。它不适用于 iPhone 4s、5、5s、5c 和 6。我测试过这些设备。【参考方案3】:

Swift 4.2 更新

只需将下面的代码插入您的项目。

用法

Vibration.success.vibrate()

源代码

  enum Vibration 
        case error
        case success
        case warning
        case light
        case medium
        case heavy
        @available(iOS 13.0, *)
        case soft
        @available(iOS 13.0, *)
        case rigid
        case selection
        case oldSchool

        public func vibrate() 
            switch self 
            case .error:
                UINotificationFeedbackGenerator().notificationOccurred(.error)
            case .success:
                UINotificationFeedbackGenerator().notificationOccurred(.success)
            case .warning:
                UINotificationFeedbackGenerator().notificationOccurred(.warning)
            case .light:
                UIImpactFeedbackGenerator(style: .light).impactOccurred()
            case .medium:
                UIImpactFeedbackGenerator(style: .medium).impactOccurred()
            case .heavy:
                UIImpactFeedbackGenerator(style: .heavy).impactOccurred()
            case .soft:
                if #available(iOS 13.0, *) 
                    UIImpactFeedbackGenerator(style: .soft).impactOccurred()
                
            case .rigid:
                if #available(iOS 13.0, *) 
                    UIImpactFeedbackGenerator(style: .rigid).impactOccurred()
                
            case .selection:
                UISelectionFeedbackGenerator().selectionChanged()
            case .oldSchool:
                AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
            
        
    

【讨论】:

不要忘记添加“import AVFoundation”以使用 .oldSchool 振动 :) 除了 .oldSchool 其余案例不工作我在 iPhone 6 物理设备上测试有什么帮助吗? 你应该解释FeedbackGenerator是触觉的,它是iPhone 7附带的。你也可以每个案例只有一行:UIImpactFeedbackGenerator(style: .heavy).impactOccurred() 唯一对我有用的是.oldSchool。我正在使用带有 iOS 14 的 iPhone 6s。iPhone 6s 确实有一个轻触引擎,它在切换静音开关时使用。是否因为苹果想让 iPhone 7 看起来更好而被禁用?或者,也许我只是做错了什么。 编辑:没关系,迈克尔的回答对我有用。【参考方案4】:

其他振动类型:

import AudioToolbox

AudioServicesPlaySystemSound(1519) // Actuate "Peek" feedback (weak boom)
AudioServicesPlaySystemSound(1520) // Actuate "Pop" feedback (strong boom)
AudioServicesPlaySystemSound(1521) // Actuate "Nope" feedback (series of three weak booms)

更多关于振动的信息 - http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/

【讨论】:

这似乎是在 iPhone 6s 上获得触觉反馈的唯一方法【参考方案5】:

Swift 4.2、5.0

 if #available(iOS 10.0, *) 
      UIImpactFeedbackGenerator(style: .light).impactOccurred()
    

您也可以选择其他样式,例如

    style: .heavy
    style: .medium

    //Note: soft and rigid available in only iOS 13.0
    style: .soft
    style: .rigid

【讨论】:

【参考方案6】:

iOS 10.0+可以试试UIFeedbackGenerator

上面的简单视图控制器,只需在您的测试“单视图应用程序”中替换您的视图控制器

import UIKit

class ViewController: UIViewController 

    var i = 0

    override func viewDidLoad() 
        super.viewDidLoad()

        let btn = UIButton()
        self.view.addSubview(btn)
        btn.translatesAutoresizingMaskIntoConstraints = false

        btn.widthAnchor.constraint(equalToConstant: 160).isActive = true
        btn.heightAnchor.constraint(equalToConstant: 160).isActive = true
        btn.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        btn.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        btn.setTitle("Tap me!", for: .normal)
        btn.setTitleColor(UIColor.red, for: .normal)
        btn.addTarget(self, action: #selector(tapped), for: .touchUpInside)
    

    @objc func tapped() 
        i += 1
        print("Running \(i)")

        switch i 
        case 1:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.error)

        case 2:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.success)

        case 3:
            let generator = UINotificationFeedbackGenerator()
            generator.notificationOccurred(.warning)

        case 4:
            let generator = UIImpactFeedbackGenerator(style: .light)
            generator.impactOccurred()
        case 5:
            let generator = UIImpactFeedbackGenerator(style: .medium)
            generator.impactOccurred()

        case 6:
            let generator = UIImpactFeedbackGenerator(style: .heavy)
            generator.impactOccurred()

        default:
            let generator = UISelectionFeedbackGenerator()
            generator.selectionChanged()
            i = 0
        
    

【讨论】:

【参考方案7】:

我们可以在 Xcode7.1 中做到这一点

import UIKit
import AudioToolbox


class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        AudioServicesPlayAlertSound(kSystemSoundID_Vibrate)
    

【讨论】:

【参考方案8】:

您可以使用AudioServicesHaptic Feedback 振动手机。

// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))

// Haptic Feedback
UIImpactFeedbackGenerator(style: .medium).impactOccurred()

查看我的开源框架Haptica,它支持Haptic FeedbackAudioServices 和独特的振动模式。 适用于 Swift 4.2、Xcode 10

【讨论】:

【参考方案9】:
import AudioToolbox

extension UIDevice 
    static func vibrate() 
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
    

现在您可以根据需要拨打UIDevice.vibrate()

【讨论】:

【参考方案10】:

iOS 10 提供 UINotificationFeedbackGenerator 并与 Haptic v2 一起使用,我们可以检查一下:

  let feedbackSupportLevel = UIDevice.current.value(forKey: "_feedbackSupportLevel") as? Int
        if #available(iOS 10.0, *), let feedbackSupportLevel = feedbackSupportLevel, feedbackSupportLevel > 1 
            do  // 1
                let generator = UIImpactFeedbackGenerator(style: .medium)
                generator.impactOccurred()
            

            do  // or 2
                let generator = UINotificationFeedbackGenerator()
                generator.notificationOccurred(.success)
            
         else 
            AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
        

【讨论】:

【参考方案11】:
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))

【讨论】:

您应该在答案中强调您使用的是AudioServicesPlaySystemSound,而不是最佳答案的AudioServicesPlayAlertSound

以上是关于uidesigner里面如何让iphone变型的主要内容,如果未能解决你的问题,请参考以下文章

A Mini Locomotive(01背包变型)

图片拉伸不变型

antd-table——内容展示变型

2/13 复习下背包+单调队列变型

最长上升子序列(LIS经典变型) dp学习~5

如何使用 Swift 让 iPhone 振动?