СollectionViewCell
это View
, а TableViewController
это ViewController
, как бы совсем разные вещи. Имейте чёткое представление об этом. Правильный вопрос: Могу ли я в СollectionViewCell
добавить TableView
или вообще говоря любой View
? (Вы это спрашивали?)pod 'GoogleAPIClientForREST'
pod 'GoogleAPIClientForREST/YouTube'
pod 'Google/SignIn'
#import <Google/SignIn.h>
#import <GTMSessionFetcher/GTMSessionFetcher.h>
#import <GTMSessionFetcher/GTMSessionFetcherService.h>
let service = GTLRYouTubeService()
.....
var configureError: NSError?
GGLContext.sharedInstance().configureWithError(&configureError)
assert(configureError == nil, "Error configuring Google services: \(configureError)")
GIDSignIn.sharedInstance().delegate = self
GIDSignIn.sharedInstance().uiDelegate = self
GIDSignIn.sharedInstance().scopes = [kGTLRAuthScopeYouTube, kGTLRAuthScopeYouTubeUpload]
GIDSignIn.sharedInstance().shouldFetchBasicProfile = true
GIDSignIn.sharedInstance().signIn()
service.authorizer = GIDSignIn.sharedInstance().currentUser.authentication.fetcherAuthorizer()
let status = GTLRYouTube_VideoStatus()
status.privacyStatus = kGTLRYouTube_VideoStatus_PrivacyStatus_Public
let snippet = GTLRYouTube_VideoSnippet()
snippet.title = "Lalala"
snippet.descriptionProperty = "TestUpload"
snippet.tags = "test,video,upload".components(separatedBy: ",")
let youtubeVideo = GTLRYouTube_Video()
youtubeVideo.snippet = snippet
youtubeVideo.status = status
let uploadParams = GTLRUploadParameters(fileURL: url, mimeType: "video/mp4")
let uploadQuery = GTLRYouTubeQuery_VideosInsert.query(withObject: youtubeVideo, part: "snippet,status", uploadParameters: uploadParams)
uploadQuery.executionParameters.uploadProgressBlock = {(progressTicket, totalBytesUploaded, totalBytesExpectedToUpload) in
print("Uploaded", totalBytesUploaded)
}
service.executeQuery(uploadQuery) { (ticket, obj, error) in
print(ticket)
print(obj)
print(error)
}
UITextField
. Для этих целей существует UITextFieldDelegate
. Или, если ты не знаешь что это такое, то просто посмотри внимательно, там есть такие события как Editing Changed/Did Begin/Did End(в том же списке, где ты и выбрал valueChanged). public enum UIReturnKeyType : Int {
case `default`
case go
case google
case join
case next
case route
case search
case send
case yahoo
case done
case emergencyCall
@available(iOS 9.0, *)
case `continue`
}
<!-- breadcrumb -->
<ul class="breadcrumb">
<li class="breadcrumb__item">
<a href="#" class="breadcrumb__link">Level 1</a>
</li>
<li class="breadcrumb__item">
<a href="#" class="breadcrumb__link">Level 2</a>
</li>
<li class="breadcrumb__item">
<a href="#" class="breadcrumb__link breadcrumb__link_is-active">Current page</a>
</li>
</ul>
<!--/. breadcrumb -->
//
// Component: breadcrumb
// --------------------------------------------------
.breadcrumb {
.nl();
margin-bottom: 15px;
margin-top: 40px;
position: relative;
&__item {
display: inline-block;
position: relative;
margin-right: 5px;
&:before {
font-family: 'FontAwesome';
font-size: 13px;
color: #fff;
content: '\f105';
display: inline-block;
vertical-align: middle;
margin: 0 5px 0 0;
}
&:first-child:before {
display: none
}
}
&__link {
font-size: 16px;
color: #fff;
text-decoration: none;
&:hover,
&:focus,
&_is-active {
color: @color-main;
}
@media(max-width: @screen-ms-max) {
font-size: 14px;
}
}
}
import UIKit
class ViewController: UIViewController {
// myDigit - переменная, куда запишем значение из поля
var myDigit: Double = 0
// Аутлет для текстового поля (чтобы достать введенное значение через метод .text)
@IBOutlet weak var myTextField: UITextField!
// Экшн для текстового поля, срабатывает по окончании ввода (нажатии Enter)
@IBAction func textFieldEntered(_ sender: UITextField) {
// Получение текста из поля, конвертирование его в Double и присвоение значения переменной
myDigit = Double(myTextField.text!)!
// Печататем в консоли значение переменной
print("myDigit = \(myDigit)")
}
UIWindow
. В этом классе настраиваются все основные потребности вашего приложения, будь то Push Notifications или Voice Calls и так далее. Я бы сказал это Core вашего приложения.UIResponder
и UIApplicationDelegate
An abstract interface for responding to and handling events.
A set of methods that are called by the singleton UIApplication object in response to important events in the lifetime of your app.
UIView.layer.shadowPath
.import UIKit
@IBDesignable
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.layer.shadowColor = UIColor.purple.cgColor
textField.layer.cornerRadius = 8
textField.layer.masksToBounds = false
textField.layer.shadowOffset = CGSize.zero
textField.layer.shadowRadius = 3.0
textField.layer.shadowOpacity = 0.7
let path = UIBezierPath()
path.move(to: CGPoint(x: 0.0, y: 0.0))
path.addLine(to: CGPoint(x: textField.bounds.size.width/2, y: textField.bounds.size.height/2))
path.addLine(to: CGPoint(x: textField.bounds.maxX, y: 0.0))
path.addLine(to: CGPoint(x: textField.bounds.maxX, y: textField.bounds.maxY))
path.addLine(to: CGPoint(x: 0.0, y: textField.bounds.maxY))
path.close()
textField.layer.shadowPath = path.cgPath
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
private var substrateView = UIView()
private var substrateLabel = UILabel()
private var constraint = NSLayoutConstraint()
@IBAction func someAction(_ sender: Any) {
substrateView.isHidden = false
UIView.animate(withDuration: 0.3) { [unowned self] in
self.constraint.isActive = false
self.constraint = self.substrateView.heightAnchor.constraint(equalToConstant: 60)
self.constraint.isActive = true
self.view.layoutIfNeeded()
}
}
override func viewDidLoad() {
super.viewDidLoad()
textField.layer.borderWidth = 3
textField.layer.borderColor = UIColor(red: 233/255, green: 128/255, blue: 129/255, alpha: 1).cgColor
textField.layer.cornerRadius = 8
substrateView.backgroundColor = UIColor(red: 233/255, green: 128/255, blue: 129/255, alpha: 1)
substrateView.layer.cornerRadius = 8
substrateLabel.text = "Login is not valid"
substrateLabel.textAlignment = .center
substrateLabel.textColor = UIColor.white
substrateLabel.backgroundColor = UIColor.clear
substrateView.addSubview(substrateLabel)
substrateLabel.translatesAutoresizingMaskIntoConstraints = false
substrateLabel.frame = CGRect.zero
substrateLabel.sizeToFit()
substrateLabel.bottomAnchor.constraint(equalTo: substrateView.bottomAnchor).isActive = true
substrateLabel.centerXAnchor.constraint(equalTo: substrateView.centerXAnchor).isActive = true
view.addSubview(substrateView)
substrateView.translatesAutoresizingMaskIntoConstraints = false
substrateView.topAnchor.constraint(equalTo: textField.topAnchor).isActive = true
substrateView.leftAnchor.constraint(equalTo: textField.leftAnchor).isActive = true
substrateView.rightAnchor.constraint(equalTo: textField.rightAnchor).isActive = true
substrateView.widthAnchor.constraint(equalTo:textField.widthAnchor).isActive = true
constraint = substrateView.heightAnchor.constraint(equalTo: textField.heightAnchor)
constraint.isActive = true
textField.layer.zPosition = 1
substrateView.isHidden = true
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
.footer {
position: relative;
background-color: @dark-grey-blue;
color: @white;
font-size: 12px;
padding: 20px;
box-sizing: border-box;
@media @desktop {
height: 200px;
padding: 0;
}
&__text {
display: block;
text-align: center;
@media @desktop {
position: absolute;
top: 75px;
left: 15px;
width: 250px;
text-align: left;
}
}
}
<div class="work" style="background-image: url('assets/Moon.png'); width: 246px; height: 344px">
<canvas width="246" height="344"/>
</div>
const canvas = document.querySelector('canvas'),
ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.filter = 'blur(11px)'; // тот самый blur
let img = new Image;
img.src = 'assets/Moon.png';
img.onload = () => {
ctx.drawImage(img, 0, 0, 246, 344); // вставляем картинку
// имитируем работы box-shadow inset
ctx.fillStyle = 'rgba(4, 4, 4, 0.33)';
ctx.fillRect(0, 0, 246, 344);
// конец иметации
// достаем заблуренную картинку
let new_img = ctx.getImageData(31, 85, 184, 234);
// конец, достали и положили в переменную new_img
// создаем новую прозрачную/пустую картинку - типо чистого png без изображения
img = ctx.createImageData(246, 344);
for (let i = img.data.length; --i >= 0;)
img.data[i] = 0;
ctx.putImageData(img, 0, 0); // вставляем на весь холст (canvas)
// конец очищения холста
ctx.putImageData(new_img, 31, 85); // вставляем заблуренный кусок
};