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】:您可以使用AudioServices
或Haptic Feedback
振动手机。
// AudioServices
AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
// Haptic Feedback
UIImpactFeedbackGenerator(style: .medium).impactOccurred()
查看我的开源框架Haptica,它支持Haptic Feedback
、AudioServices
和独特的振动模式。 适用于 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变型的主要内容,如果未能解决你的问题,请参考以下文章